理解Python中的super()

非原创文章转自:link

在单继承时,*super().init()Base().init()*是一样的。super()避免了基类的显示掉用。
代码如下:
super().init()

class Base():
    def __init__(self):
        print("我是张三")

class A(Base):
    def __init__(self):
        Base.__init__(self)
        print('我是李四')

A()

# 输出结果 
# 我是张三
# 我是李四

Base.init()

class Base():
    def __init__(self):
        print("我是张三")

class A(Base):
    def __init__(self):
        super().__init__()
        # super(A,self).__init__() python2
        print('我是李四')

A()

# 输出结果
# 我是张三
# 我是李四
  • 多继承
    super()与父类没有实质性的关联。在单继承时,super获取的类刚好是父类,多继承时,super获取的是继承顺序中的下一个类。以下面的继承方式位列
   Base
   /  \
  /    \
 A      B
  \    /
   \  /
     C
# 就是Base为父类 同时被A类和B类继承然后C类有同事继承了A类和B类

使用super,代码如下:

class Base():
    def __init__(self):
        print('我是张三')
        print("我是李四")


class A(Base):
    def __init__(self):
        print('我是陈胜')
        super().__init__()
        print('我是吴广')


class B(Base):
    def __init__(self):
        print('我是阿斌')
        super().__init__()
        print('我是白洁')


class C(A, B):
    def __init__(self):
        print("我是爸爸")
        super().__init__()
        print("我是妈妈")


C()

# 输出结果:
# 我是爸爸
# 我是陈胜
# 我是阿斌
# 我是张三
# 我是李四
# 我是白洁
# 我是吴广
# 我是妈妈



如果不适用super,代码如下:

lass Base():
    def __init__(self):
        print('我是张三')
        print("我是李四")


class A(Base):
    def __init__(self):
        print('我是陈胜')
        Base.__init__(self)
        print('我是吴广')


class B(Base):
    def __init__(self):
        print('我是阿斌')
        Base.__init__(self)
        print('我是白洁')


class C(A, B):
    def __init__(self):
        print("我是爸爸")
        A.__init__(self)
        B.__init__(self)
        print("我是妈妈")


C()

# 输出结果 可以看出Base()执行了两次

# 我是爸爸
# 我是陈胜
# 我是张三
# 我是李四
# 我是吴广
# 我是阿斌
# 我是张三
# 我是李四
# 我是白洁
# 我是妈妈

对于定义的类,在Python中会创建一个MRO(Method Resolution Order)列表,它代表了类继承的顺序。查看MRO列表


class Base():
    def __init__(self):
        print('我是张三')
        print("我是李四")


class A(Base):
    def __init__(self):
        print('我是陈胜')
        Base.__init__(self)
        print('我是吴广')


class B(Base):
    def __init__(self):
        print('我是阿斌')
        Base.__init__(self)
        print('我是白洁')


class C(A, B):
    def __init__(self):
        print("我是爸爸")
        A.__init__(self)
        B.__init__(self)
        print("我是妈妈")


print(C.mro())
# 输出结果
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]

使用super()

class Base():
    def __init__(self):
        print('我是张三')
        print("我是李四")


class A(Base):
    def __init__(self):
        print('我是陈胜')
        super().__init__()
        print('我是吴广')


class B(Base):
    def __init__(self):
        print('我是阿斌')
        super().__init__()
        print('我是白洁')


class C(A, B):
    def __init__(self):
        print("我是爸爸")
        super().__init__()
        print("我是妈妈")

print(C.mro())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值