继承:子类需要复用父类里面的属性或者方法,子类也可以提供自己的属性和方法
多重继承:
Python中子类调用父类的方法有两种方法能够实现:调用父类构造方法,或者使用super函数(两者不要混用)。
继承是面向对象编程的一个重要的方式,通过继承,子类就可以扩展父类的能。在python中一个类能继承自不止一个父类,这叫做python的多重继承(Multiple Inheritance )。
私有的属性、方法,不会被子类继承,也不能被访问
一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
在Python中是支持多重继承的,也就是我们可以为一个类同时指定多个父类
可以在类名的()后边添加多个类,来实现多重继承
多重继承,会使子类同时拥有多个父类,并且会获取到所有父类中的方法
在开发中没有特殊的情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码过于复杂
如果多个父类中有同名的方法,则会现在第一个父类中寻找,然后找第二个,然后找第三个.....
前边父类的方法会覆盖后边父类的方法
旧算法的MRO推导算法很直观,它使用树状结构组织类。当函数调来到来的时候从左往右的使用深度优先遍历父类:
1,检查对象是否实现了方法
2,如果没有找到,检查首个父类是否实现了该方法
3,如果没有找到,检查本类是否还继承了其他类,是的话从其他分支向上追溯
class A(object):
def __init__(self):
print("init A 开始被调用")
print( "init A Class")
print("init A 结束被调用")
class B(A):
def __init__(self):
print("init B 开始被调用")
print("init B class")
super(B, self).__init__()
print("init B 结束被调用")
class C(A):
def __init__(self):
print("init C 开始被调用")
print("init C class")
super(C, self).__init__()
print("init C 结束被调用")
class D(B,C):
def __init__(self):
print("init D 开始被调用")
print ("init D class")
super(D, self).__init__()
print("init D 结束被调用")
class E(A):
def __init__(self):
print("init E 开始被调用")
print ("init E class")
super(E, self).__init__()
print("init E 结束被调用")
class F(E,D):
def __init__(self):
print("init F 开始被调用")
print ("init F class")
super(F, self).__init__()
print("init F 结束被调用")
# a = A()
# b = B()
# c = C()
# d = D()
# e = E()
f = F()
结果:
--------------------------------------------------------------------------------
init F 开始被调用
init F class
init E 开始被调用
init E class
init D 开始被调用
init D class
init B 开始被调用
init B class
init C 开始被调用
init C class
init A 开始被调用
init A Class
init A 结束被调用
init C 结束被调用
init B 结束被调用
init D 结束被调用
init E 结束被调用
init F 结束被调用
(<class ‘__main__.F‘>, <class ‘__main__.E‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>)
--------------------------------------------------------------------------------
若改为
class A(object):
def __init__(self):
print("init A 开始被调用")
print( "init A Class")
print("init A 结束被调用")
class B(A):
def __init__(self):
print("init B 开始被调用")
print("init B class")
super(B, self).__init__()
print("init B 结束被调用")
class C(A):
def __init__(self):
print("init C 开始被调用")
print("init C class")
super(C, self).__init__()
print("init C 结束被调用")
class D(B,C):
def __init__(self):
print("init D 开始被调用")
print ("init D class")
super(D, self).__init__()
print("init D 结束被调用")
class E(A):
def __init__(self):
print("init E 开始被调用")
print ("init E class")
super(E, self).__init__()
print("init E 结束被调用")
class F(D,E):
def __init__(self):
print("init F 开始被调用")
print ("init F class")
super(F, self).__init__()
print("init F 结束被调用")
# a = A()
# b = B()
# c = C()
# d = D()
# e = E()
f = F()
则结果:
--------------------------------------------------------------------------------
init F 开始被调用
init F class
init D 开始被调用
init D class
init B 开始被调用
init B class
init C 开始被调用
init C class
init E 开始被调用
init E class
init A 开始被调用
init A Class
init A 结束被调用
init E 结束被调用
init C 结束被调用
init B 结束被调用
init D 结束被调用
init F 结束被调用
(<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.C‘>, <class ‘__main__.E‘>, <class ‘__main__.A‘>, <class ‘object‘>)
--------------------------------------------------------------------------------
原文:https://www.cnblogs.com/vanjoe/p/12768062.html