python中关于多继承的使用

文章讨论了Python中两种常见的继承初始化方法:直接调用父类的__init__(self)和使用super().__init__()。通过示例代码展示了两种方法在多继承场景下的区别,指出使用super()能避免重复调用父类初始化,且遵循C3线性化规则来决定调用顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hi,大家好,在我们工作中,经常用到继承,但python的继承有两种,一种是直接调用父类名.__init__(self),另外一种是super().__init__()。

首先,我们来看第一种,直接上代码

class Animal(object):

    def __init__(self, name):
        print("Animal的init开始被调用")
        self.name = name
        print("Animal的init的调用结束")


class Lion(Animal):
    def __init__(self, name, age):
        print("Lion的init开始被调用")
        self.age = age
        Animal.__init__(self, name)
        print("Lion的init的调用结束")


class Tiger(Animal):
    def __init__(self, name, gender):
        print("Tiger的init开始被调用")
        self.gender = gender
        Animal.__init__(self, name)
        print("Tiger的init的调用结束")


class Liger(Lion, Tiger):
    def __init__(self, name, age, gender):
        print("Liger的init开始被调用")
        Lion.__init__(self, name, age)
        Tiger.__init__(self, name, gender)
        print("Liger的init的调用结束")


liger = Liger('luna', 6, '女')

Liger的init开始被调用
Lion的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Lion的init的调用结束
Tiger的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Tiger的init的调用结束
Liger的init的调用结束

从打印的结果可以看出,当使用 父类名.__init__(self)时,我们实例化对象时候,会掉用两次Animal(),这是因为当调用Liger()时,会分别继承Lion(),Tiger(),而这两个都会继承Animal(),所以最终结果是调用两次Animal()。

第二种,super().__init__()。

class Animal(object):

    def __init__(self, name, *args, **kwargs):
        print("Animal的init开始被调用")
        self.name = name
        print("Animal的init的调用结束")


class Lion(Animal):
    def __init__(self, name, age, *args, **kwargs):
        print("Lion的init开始被调用")
        self.age = age
        super().__init__(name, *args, **kwargs)
        print("Lion的init的调用结束")


class Tiger(Animal):
    def __init__(self, name, gender, *args, **kwargs):
        print("Tiger的init开始被调用")
        self.gender = gender
        super().__init__(name, *args, **kwargs)
        print("Tiger的init的调用结束")


class Liger(Lion, Tiger):
    def __init__(self, name, age, gender):
        print("Liger的init开始被调用")
        super().__init__(self, name, age, gender)
        print("Liger的init的调用结束")


print(Lion.__mro__)

liger = Liger('luna', 6, '女')

(<class '__main__.Lion'>, <class '__main__.Animal'>, <class 'object'>)
Liger的init开始被调用
Lion的init开始被调用
Tiger的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Tiger的init的调用结束
Lion的init的调用结束
Liger的init的调用结束

从打印的结果中我们可以看出,使用super().__init__()时,Animal只会调用一次,其原因是,python解释器里有C3算法,可以重新规划super()调用父类的顺序,可以根据类名.__mro__查看调用顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值