前言:
从子类化内置类型引起的问题谈起:内置类型的原生方法使用C语言实现
,不会调用子类中覆盖的方法。
目录:
- 内容回顾
- 相关资料
- 阅读后感
正文:
一. 内容回顾
1.1 子类化内置类型很麻烦
内置类型的方法不会调用子类覆盖的方法。例如,dict的子类覆盖的_ getitem_()方法不会被内置类型的get()方法调用。
1.2 多重继承和方法解析顺序
示例代码:
# -*- coding:UTF-8 -*-
class A:
def ping(self):
print 'this is A'
class B(A):
def pong(self):
print 'this is B'
class C(A):
def pong(self):
print 'this is C'
class D(B, C):
def ping(self):
print('this is D')
def ping_pong(self):
self.ping()
self.pong()
C.pong(self)
if __name__ == '__main__':
d = D()
print('---------1---------')
d.ping()
print('---------2---------')
d.pong()
print('---------3---------')
d.ping_pong()
输出结果:
"D:\python 2.7\python.exe" E:/Codes/FluencePython/Chapter_12/demo_2_two.py
---------1---------
this is D
---------2---------
this is B
---------3---------
this is D
this is B
this is C
Process finished with exit code 0
结果解析:
1.3 多重继承的真实应用
在标准库中,GUI工具包Tkinter把多重继承用到了极致。
1.4 处理多重继承
使用多重继承容易得出令人费解和脆弱的设计,下面是避免把类图搅乱的一些建议:
1)把接口继承和实现继承区分开
2)使用抽象基类显式表示接口
3)通过混入通用代码
4)在名称中明确指明混入
5)抽象基类可以作为混入,反过来则不成立
6)不要子类化多个具体类
7)为用户提供聚合类
8)优先使用对象组合,而不是类继承
1.5 一个现代示例:Djangot通用视图中的混入
二. 相关资料
2.1 多重继承是编程语言中的概念,多重继承指的是一个类可以继承另外一个类,而另外一个类又可以继承别的类,比如A类继承B类,而B类又可以继承C类,这就是多重继承。
2.2 通过多重继承,一个子类就可以同时获得多个父类的所有功能。
三. 阅读后感
继承的优点:
复用,可以减少代码重复。
继承的缺点:
两个基类中的同名方法会产生二义性,容易不确定调用了哪个基类中的方法。