【摘】人生苦短, 每日python

本文探讨了Python中super()函数的使用,特别是在多重继承场景下的复杂性。通过实例展示了如何正确使用super()来调用基类方法,避免重复调用的问题。强调了在Python2和Python3中的一致性和最佳实践。

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

python和它的super

如果用过python2,你一定见过下面这个奇怪的代码

class Mama(object):

    def says(self):

        print('i am mama')

class Sister(Mama):

    def says(self):

        Mama.says(self)
        print('i am sister')

if __name__ == '__main__':

    sister = Sister()
    sister.says()

它的结果是

i am mama
i am sister

或者这种奇怪的写法, 不过它只支持继承了object类的

class Sister(Mama):

    def says(self):

        super(Sister, self).says()
        print('i am sister')

python和多重继承的坑

如果你之前没见过下面的这段代码,那你最好运行下

class A(object):

    def __init__(self):

        print('A')
        super(A, self).__init__()


class B(object):

    def __init__(self):

        print('B')
        super(B, self).__init__()



class C(A, B):

    def __init__(self):

        print('C'),
        A.__init__(self)
        B.__init__(self)


if __name__ == '__main__':
    print('MRO:', [x.__name__ for x in C.__mro__])
    print('Calls:')
    C()

它的结果是

MRO: ['C', 'A', 'B', 'object']
Calls:
C
A
B
B

虽然A类并未继承B类,但是在C类中的父类关系却是:C继承了A,A继承了B
所以调用A.__init(self)__的时候,不仅仅打印了A,还打印了B
这就导致,B的init被调用了两次

所以我们要

避免多重继承
super的使用必须一致(要么全部用super,要么全不用)
如果代码的使用范围包括python2,在python3中也应该显示地继承自object
调用父类时必须查看类的层次结构

摘自 《Python高级编程》

转载于:https://www.cnblogs.com/featherw/p/10335460.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值