继承
class A: def spam(self): print("A.SPAM") def add(self, x,y): return x+y class B(A): def spam(self): """ 如果子类要对父类的方法进行重写,再想调用父类的方法,就需要使用super().方法名() 的形式 """ print("B.Spam") super().spam() #调用父类的spam() b = B() b.spam() print(b.add(8,8)) class C: def __init__(self): self.x = 100 def compare(self, num): if self.x>num: return self.x else: return num class D(C): def __init__(self): super().__init__() #super() 函数的一个常见用法是在__init__() 方法中确保父类被正确的初始化 self.x = 300 #更改父类 self.y = 500 d= D() print(d.compare(101)) #300 得到的结果也会更改 print(d.y) #500 print(d.x)
多继承
http://python.jobbole.com/86787/
#python中的多继承 class A: def foo(self): print("A类的方法") class B: def foo(self): print("B类的方法") def foo_1(self): print("B类专有的方法") class C(A,B): pass class D(C, A): pass """ class D(A, C): pass 会报错: TypeError: Cannot create a consistent method resolution order (MRO) for bases A, C 原因分析参考: https://www.cnblogs.com/yudy/archive/2013/06/10/3130521.html https://www.cnblogs.com/seven777/p/7189932.html """ c = C() c.foo() #>>>A类的方法 c.foo_1() #>>>B类专有的方法 d = D() d.foo() #>>>A类的方法
print(D.mro())
#>>>[<class '__main__.D'>, <class '__main__.C'>, <class '__main__.E'>, <class '__main__.A'>, <class 'object'>]
总结:
两个概念:经典类,新式类
继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;
新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动
参考文章:
http://python.jobbole.com/86787/
https://www.zhihu.com/question/266882644