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()

selfd,会根据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
posted @ 2023-07-31 23:56  lxd670  阅读(12)  评论(0编辑  收藏  举报