Python: 封装与继承
最后更新:2026-09-22
封装把对象的内部细节藏起来,只暴露安全的操作接口。继承让一个类自动拥有另一个类的功能,不用重复写。这两个概念是面向对象编程的中坚力量。
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. 常见应用场景
- 数据验证:用
@property.setter确保赋值时数据合法。 - 只读属性:用
@property不加 setter 创建只读属性。 - 代码复用:把通用功能放在基类,子类只写差异部分。
- 功能组合:用 Mixin 给不同的类灵活添加功能。
❓ 常见问题
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 类很小且功能独立,避免了钻石问题。📖 小节
- 封装:
_表示"别动我",__触发名称改写,@property提供优雅的访问控制 - 继承:子类自动拥有父类的属性和方法,
super()调用父类方法 - 方法重写:子类定义和父类同名的方法来覆盖
- Mixin:通过多继承给类灵活添加功能,比深层次继承更可取
- Python 没有真正的私有属性,靠约定和名称改写保护
📝 作业
-
基础题(难度⭐):定义一个
Product类,用@property控制price属性——设置时必须为正数,获取时返回原值。 -
进阶题(难度⭐⭐):定义一个
Animal→Mammal→Dog/Cat三层继承结构。Animal有name和age,Mammal加fur_color,Dog和Cat各自实现speak()方法。 -
挑战题(难度⭐⭐⭐):创建一个日志系统,包含
LoggableMixin(提供log_info()、log_error()方法)和一个基类Application(有name属性)。让WebApp和CLIApp都继承Application并混入LoggableMixin,实现日志功能。