- 多态
- 封装
- 继承
- 要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可。
7.2.5 类的命名空间
在class语句中定义的代码都是在一个特殊的命名空间内执行的,类的所有成员都可访问这个命名空间。类定义其实就是要执行的代码段。
在类定义中,并非只能包含def语句。
7.2.6 指定超类
7.2.7 深入探讨继承
- 如果你有一个类,并想知道它的基类,可访问其特殊属性__bases__。
7.2.8 多个超类
多重继承 是一个功能强大的工具。然而,除非万不得已,否则应避免使用多重继承,因为在有些情况下,它可能带来意外的“并发症”。
使用多重继承时,有一点务必注意:如果多个超类以不同的方式实现了同一个方法(即有多个同名方法),必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面的类的方法。因此,在前面的示例中,如果Calculator类包含方法talk,那么这个方法将覆盖Talker
类的方法talk(导致它不可访问)。如果像下面这样反转超类的排列顺序:
class TalkingCalculator(Talker, Calculator): pass
将导致Talker的方法talk是可以访问的。多个超类的超类相同时,查找特定方法或属性时访问超类的顺序称为方法解析顺序(MRO),它使用的算法非常复杂。所幸其效果很好,你可能根本无需担心。
7.2.9 接口和内省
瑶池和狂野
7.2.10 抽象基类
7.4.1 本章介绍的新函数
函 数 | 描 述 |
---|---|
callable(object) | 判断对象是否是可调用的(如是否是函数或方法) |
getattr(object,name[,default]) | 获取属性的值,还可提供默认值 |
hasattr(object, name) | 确定对象是否有指定的属性 |
isinstance(object, class) | 确定对象是否是指定类的实例 |
issubclass(A, B) | 确定A是否是B的子类 |
random.choice(sequence) | 从一个非空序列中随机地选择一个元素 |
setattr(object, name, value) | 将对象的指定属性设置为指定的值 |
type(object) | 返回对象的类型 |