python多重继承/多继承相关

1 使用父类名.方法名调用父类方法

class Parent():
    def __init__(self,name):
        self.name = name
        print("Parent的init方法被调用")

class Son1(Parent):
    def __init__(self,name,age):
        self.age = age
        Parent.__init__(self,name)
        print("Son1的init方法被调用")


class Son2(Parent):
    def __init__(self,name,gender):
        self.gender = gender
        Parent.__init__(self,name)
        print("Son2的init方法被调用")


class Grandson(Son1,Son2):
    def __init__(self,name,age,gender):
        Son1.__init__(self,name,age)
        Son2.__init__(self,name,gender)
        print("Grandson的init方法被调用")


g = Grandson("laowang",22,"男")

输出结果:

Parent的init方法被调用
Son1的init方法被调用
Parent的init方法被调用
Son2的init方法被调用
Grandson的init方法被调用

2 使用super().方法名的方式调用父类方法:

class Parent():
    def __init__(self,*args):
        self.name = args[2]
        print("Parent的init方法被调用")

class Son1(Parent):
    def __init__(self,*args):
        name,self.age,gender = args
        super().__init__(*args)
        print("Son1的init方法被调用")


class Son2(Parent):
    def __init__(self,*args):
        name,age,self.gender = args
        super().__init__(*args)
        print("Son2的init方法被调用")


class Grandson(Son1,Son2):
    def __init__(self,name,age,gender):
        super().__init__(name,age,gender)
        print("Grandson的init方法被调用")


g = Grandson("laowang",22,"男")
print(Grandson.__mro__)

输出结果:

Parent的init方法被调用
Son2的init方法被调用
Son1的init方法被调用
Grandson的init方法被调用
(<class '__main__.Grandson'>, <class '__main__.Son1'>, <class '__main__.Son2'>, <class '__main__.Parent'>, <class 'object'>)

 

由上述代码得出结论:

使用父类名.方法名()方式调用父类方法在多重继承中会造成父类被重复调用。

而使用super().方法名()方式调用父类方法则不会重复调用。

 

关于使用super()调用父类方法时代码的执行顺序:

使用类名.__mro__可以查看当前类的多重继承执行顺序,该执行顺序是使用C3算法计算得出。

而C3算法使用的是BFS算法(广度优先搜索算法),在二叉树中表现为尽可能的寻找更多分叉。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值