Inheritance
继承
例子
继承说简单点就是一个类可以继承另一个类的方法和属性
class Father:
def __init__(self):
self.Fname = 'Da'
def func(self):
print('father.func')
def bad(self):
print('father.bad')
# 子类/派生类
class Son(Father):
def __init__(self):
self.Sname = 'Yo'
def bar(self):
print('son.bar')
s = Son()
s.func()
输出
father.func
当然子类也可以覆盖(重写)父类
class Father:
def __init__(self):
self.Fname = 'Da'
def func(self):
print('father.func')
def bad(self):
print('father.bad')
# 子类/派生类
class Son(Father):
def __init__(self):
self.Sname = 'Yo'
def bar(self):
print('son.bar')
def bad(self):
print('Son so bad than father')
s = Son()
s.bad()
输出
Son so bad than father
经典类
class Father:
def __init__(self):
self.Fname = 'Da'
print('Father init.')
def func(self):
print('father.func')
def bad(self):
print('father.bad')
# 子类/派生类
class Son(Father):
def __init__(self):
print('Son init.')
Father.__init__(self)
self.Sname = 'Yo'
def bar(self):
print('son.bar')
def bad(self):
print('Son so bad than father')
s = Son()
新式类
# 父类/基类
class Father(object):
def __init__(self):
self.Fname = 'Da'
print('Father init.')
def func(self):
print('father.func')
def bad(self):
print('father.bad')
# 子类/派生类
class Son(Father):
def __init__(self):
print('Son init.')
super(Son, self).__init__()
self.Sname = 'Yo'
def bar(self):
print('son.bar')
def bad(self):
print('Son so bad than father')
s = Son()
输出
Son init.
Father init.
多继承(MRO)
新式类和经典类,在多继承的情况下,他们的继承顺序会有点不一样
经典类
class A:
def __init__(self):
print('A')
def save(self):
print('save method from A.')
class B(A):
def __init__(self):
print('B')
class C(A):
def __init__(self):
print('C')
def save(self):
print('save method from C.')
class D(B, C):
def __init__(self):
print(D)
t = D()
t.save()
输出
__main__.D
save method from A.
新式类
class A(object):
def __init__(self):
print('A')
def save(self):
print('save method from A.')
class B(A):
def __init__(self):
print('B')
class C(A):
def __init__(self):
print('C')
def save(self):
print('save method from C.')
class D(B, C):
def __init__(self):
print(D)
t = D()
t.save()
输出
<class '__main__.D'>
save method from C.
从输出结果可以看到,新式类和经典类他们继承到的方法是不同的,经典类继承到了基类的方法,而新式类则继承到了最近一级父类的方法,查阅一番资料后得知
- 经典类使用的是深度优先算法
- 新式类使用的是广度优先算法
经典类查找顺序是:B->A->C 新式类查找顺序是:B->C->A
所以两者最红获取到的方法是不同的,3.x测试了下,默认就是使用广度优先的
错了,错了,Python3的MRO算法不是广度优先,而是C3算法