在上篇札记Python札记34中主要是讨论继承
和单继承
方面的知识,本篇札记中主要是学习多继承
的特点。
一个类是可以继承自多个父类的
class Person:
def __init__(self, name):
self.name = name
def age(self, n):
return "The age of Peter is {}".format(n)
class Boy:
heigth = 180
def color(self):
return "The boy is yellow"
class TallBoy(Person, Boy):
pass
if __name__ == "__main__":
boy = TallBoy("Peter")
print(boy.name)
print(boy.age(25))
print(boy.heigth)
print(boy.color())
结果:
Peter
The age of Peter is 25
180
The boy is yellow
Boy
类有一个属性heigth=180
,被实例化之后这个类属性也被继承到TallBoy
中,因此boy.heigth
能够获取到该属性值。- 继承多个类直接将类的名称写在括号里面
- 父类的方法全部继承到子类中
- 若子类重写了父类的方法,那么就使用子类的方法,父类的将被覆盖
继承的顺序问题
在Python2的新式类和Python3中,继承顺序都是“广度优先”,和算法MRO(Method Resolution Order)相关。
class K1:
def foo(self):
print("K1-foo")
class K2:
def foo(self):
print("K2-foo")
def bar(self):
print("K2-bar")
class J1(K1, K2):
pass
class J2(K1, K2):
def bar(self):
print("J2-bar")
class C(J1, J2):
pass
if __name__ == "__main__":
print(C.__mro__)
m = C()
m.foo()
m.bar()
结果为
(<class '__main__.C'>, <class '__main__.J1'>, <class '__main__.J2'>, <class '__main__.K1'>, <class '__main__.K2'>, <class 'object'>)
K1-foo
J2-bar
image.png
如果有继承关系如上图所示,应该怎么写出Python代码?笔者写法如下:
class D:
def foo(self):
print("foo in D")
def bar(self):
print("bar in D")
class E:
def bar(self):
print("bar in E")
class F:
def foo(self):
print("foo in F")
class B(D, E):
pass
class C(D, F):
def age(self, n):
print("His age is {}".format(n))
class A(B, C):
pass
a = A()
print(A.__mro__)
a.foo()
a.bar()
a.age(20)
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class '__main__.E'>, <class '__main__.F'>, <class 'object'>)
foo in D
bar in D
His age is 20
对比代码:
class D:
def foo(self):
print("foo in D")
def bar(self):
print("bar in D")
class E:
def bar(self):
print("bar in E")
class F:
def foo(self):
print("foo in F")
class B(D, E):
pass
class C(F, D):
def age(self, n):
print("His age is {}".format(n))
class A(B, C):
pass
a = A()
print(A.__mro__)
a.foo()
a.bar()
a.age(20)
(<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.F'>, <class '__main__.D'>, <class '__main__.E'>, <class 'object'>)
foo in F
bar in D
His age is 20