Python: 封装与继承

最后更新:2026-09-22

封装把对象的内部细节藏起来,只暴露安全的操作接口。继承让一个类自动拥有另一个类的功能,不用重复写。这两个概念是面向对象编程的中坚力量。


相关内置函数:super()

1. 封装与私有属性

封装(Encapsulation)的意思是——对象的内部数据不应该被外部直接访问,而是通过方法来操作。

(1) 单下划线 _ —— 约定为"保护"属性

▶ 示例:单下划线与双下划线

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功

单下划线只是约定,不是强制——Python 不会阻止你访问。它相当于在文档里写"这是内部属性,别碰"。

(2) 双下划线 __ —— 名称改写(Name Mangling)

▶ 示例:银行账户类

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功

双下划线触发名称改写——__balance 在内部变成了 _BankAccount__balance。这不是真正的"私有",只是让意外覆盖的可能性更小。

💡 Python 没有真正的私有。 它靠的是"大家都是成年人"的默契——单下划线表示"内部使用",双下划线防止名字冲突。其他语言(如 Java)有真正的 private 关键字,Python 没有也不打算加。

▶ 示例:温度类(难度⭐⭐)

▶ 试一试

输出:

TEXT 📖 仅展示
温度不能低于绝对零度!


2. @property:优雅的访问控制

用 set_celsius() / get_celsius() 太啰嗦了。@property 让你既能控制访问,又能像访问属性一样自然:

▶ 示例:使用 @property

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功
💡 @property 的优势: ① 调用时不需要括号 t.celsius 而不是 t.get_celsius()。② 赋值时自动校验 t.celsius = value 而不是 t.set_celsius(value)。③ 可以在不破坏已有代码的前提下,把普通属性改成需要计算的属性。



3. 继承

继承让子类拥有父类的所有属性和方法:

▶ 示例:动物继承

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功

(1) super():调用父类方法

▶ 示例:super() 调用父类

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功


4. Mixin 模式

Mixin 是一种特殊的类——不单独使用,而是通过"混入"给其他类增加功能:

▶ 示例:Mixin 混入模式

▶ 试一试

输出:

TEXT 📖 仅展示
# 函数定义成功
💡 Mixin 的命名惯例: 类名以 Mixin 结尾,表示这是用来混入的,不是独立使用的。一个类可以混入多个 Mixin,加上一个主基类——比单继承灵活得多。



5. 常见应用场景


相关内置函数:super()

❓ 常见问题

Q 什么时候用继承,什么时候用 Mixin?
A 继承适合"is-a"关系——狗是一种动物。Mixin 适合"has-a能力"——鸭子会游泳。能用组合(Mixin)就别用继承,因为继承层次太深后代码很难维护。一个好经验:继承不超过 3 层。
Q @property 和普通方法有什么区别?
A @property 让方法看起来像属性——访问时不用加括号,赋值时自动触发 setter。本质上是"属性拦截器"——你像操作属性一样写代码,实际上是方法在执行。
Q Python 支持多继承吗?有什么坑?
A 支持——class C(A, B)。但多继承有"钻石问题"(两个父类有同名方法到底用哪个)。Python 用 MRO(方法解析顺序)解决,从左到右搜索。Mixin 就是利用多继承的设计模式,Mixin 类很小且功能独立,避免了钻石问题。

📖 小节


📝 作业

  1. 基础题(难度⭐):定义一个 Product 类,用 @property 控制 price 属性——设置时必须为正数,获取时返回原值。

  2. 进阶题(难度⭐⭐):定义一个 Animal → Mammal → Dog / Cat 三层继承结构。Animal 有 name 和 age,Mammal 加 fur_color,Dog 和 Cat 各自实现 speak() 方法。

  3. 挑战题(难度⭐⭐⭐):创建一个日志系统,包含 LoggableMixin(提供 log_info()、log_error() 方法)和一个基类 Application(有 name 属性)。让 WebApp 和 CLIApp 都继承 Application 并混入 LoggableMixin,实现日志功能。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏