深度遍历就可以了
四、super
super()可以帮我们执?MRO中下?个?类的?法,通常super()有两个使?的地?:
- 可以访问?类的构造?法
- 当?类?法想调??类(MRO)中的?法
class super(object)
| super() -> same as super(__class__, <first argument>)
| super(type) -> unbound super object
| super(type, obj) -> bound super object; requires isinstance(obj, type)
我们先来看第一种情况:子类访问父类的构造方法:
class A:
def __init__(self, a, b):
self.a = a
self.b = b
class B(A):
def __init__(self, a, b, c, d):
super(B, self).__init__(a, b) # 访问父类的构造方法
self.c = c
self.d = d
b = B(1, 2, 3, 4)
print(b.__dict__)
# 结果:
# {'a': 1, 'b': 2, 'c': 3, 'd': 4}
第二种情况:?类?法想调??类(MRO)中的?法
class D:
def func(self):
print('我是D类的func')
class E:
def func(self):
print('我是E类的func')
class C(E):
def func(self):
print('我是C类的func')
class B(D):
def func(self):
print('我是B类的func1')
super
class A(B, C):
def func(self):
super().func()
def func2(self):
super(D, self).func() # 这里可以直接调用MRO中super指定类的下一个类中的方法,即C中的func方法
# A的MRO顺序为: A -> B -> D -> C -> E
a = A()
a.func()
# 我是B类的func1
a.func2()
# 我是C类的func
super的使用:
super()
和super(cls, object).functions
的调用是一样的(cls是指调用super方法的那个类,不是指定另一个类而是类本身)
super(cls, object).functions
可以指定cls,让super调用MRO中指定类的下一个类的方法(上面就是一个很好的例子)
注意:不管super()写在哪?,在哪?执?,?定先找到MRO列表,根据MRO列表的顺序往下找,否则?切都是错的