C12继承的优缺点
12.1 子类化内置类型很麻烦
自测
1.内置类型的方法会不会隐式调用子类覆盖的方法?
2. 当你子类化如 dict、 list 或 str时,会选择直接继承他们吗?
答案
1.
会显示的调用,但并不会隐式的调用。
2.
不会,因为内置类型的方法通常会忽略用户覆盖的方法。
而使用 collections 模块中的 UserDict、 UserList 和 UserString,这些类做了特殊设计,会更易于扩展。
如下就是将其换成了userDict的
12.2 多重继承和方法解析顺序
自测
1. 调用B还是C?
2.怎么查看继承时,方法的解析顺序?
3.为什么建议使用super来调用父类的方法?
答案
1.
小写。
调用的是参数写为第一个作为父类的方法。即D(B,C)中的B。不相信我的话的请看我这一小节的问题3的执行图。
2.
Method Resolution Order, MRO。
类都有一个名为 mro 的属性,它的值是一个元组,按照方法解析顺序列出各个超类,从当前类一直向上,直到object 类。
如图某个类的解析顺序。
3.
super调用:从3问题的插图中我们可以看到,使用supper并不需要指定类名,这就让代码更加灵活了,且supper调用时不用将self传递进去。
类来调用:一般python中很少出现父类同级方法还一直的,还需要被继承的,这种写法也并不规范,所以我们并不需要直接通过用类名来调用。
self来调用:当类没有出现与父类同名方法时,这种调用仍旧可以得到父类的方法,但万一哪一天我们又加一个同名的方法,这里又忘掉改了呢?岂不是自己给自己挖了坑。所以直接用super会更为显示。
故一般推荐使用super.