python中super使用
1.super初识
super().__init__(name)
super(B, self).__init__(name)
A.__init__(self, name)
super(B, self).__init__(name)
表示从B往后的mro继承关系查找(不包含B)
A.__init__(self, name)
指名道姓的,不推荐
class A:
def __init__(self, name) -> None:
self.name = name
class B(A):
def __init__(self, name) -> None:
# 下面都是一样
super().__init__(name)
# super(B, self).__init__(name)
# A.__init__(self, name)
self.age= 10
b = B('ling')
print(b.__dict__)
{'name': 'ling', 'age': 10}
2.super的参数
super(type, obj)
type: 在obj的mro上,从哪个type之后开始查找
obj: 根据obj的mro顺序查找(obj必须是type的实例或者是子类的实例)
流程图源文件
class Base:
def __init__(self):
print('Base.__init__')
class A(Base):
def __init__(self):
super().__init__()
print('A.__init__')
class B(Base):
def __init__(self):
super().__init__()
print('B.__init__')
class C(Base):
def __init__(self):
super().__init__()
print('C.__init__')
class D(A, B, C):
def __init__(self):
# self是B的子类D的实例
super(B, self).__init__()
print('D.__init__')
# 继承关系D -> A -> B -> C -> Base -> Object
print(D.mro())
d = D()
Base.__init__
C.__init__
D.__init__
3.super案例
B.say(self)
中使用了super().say()
super().say()
==super(B, self).say()
self
是d
,会根据d的mro顺序查找到B后面是C
class Base:
def say(self):
print('Base')
class A(Base):
def say(self):
super().say()
print('A')
class B(Base):
def say(self):
super().say()/
class C(Base):
def say(self):
super().say()
print('C')
class D(A, B, C):
def say(self):
B.say(self)
d = D()
d.say()
Base
C