python中经典类和新式类,super方法的理解

本文详细解析了Python中经典类与新式类的区别,重点介绍了新式类在多重继承时采用的C3算法,以及如何使用super解决经典类在多重继承中遇到的问题。

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

什么是经典类和新式类

经典类:是python2.2之前的,到了python2.7依旧支持,python3.x之后只支持新式类了

新式类:从python2.2之后至今都在使用,现在默认都是新式类

新式类比经典类有什么优点:

原因在于经典类在类多重继承的时候是采用从左到右深度优先原则匹配方法的,而新式类是采用C3算法(不同于广度优先)进行匹配的,经典类最容易出现的就是子类越过父类的方法

在多重继承中,我们可以测试一下搜索成员的顺序:

新式类的经典类的继承:

 

class A:
    def __init__(self):
        print("i am A")
        self.can = True
    def sing(self):
        if can:
            print("a is singing")

class B(A):
    def __init__(self):
        print("i am B")
    def eat(self):
        print("b is eating")

h = B()
h.eat()     # 正确执行
h.sing()    # 报错,因为A的__init__被B的__init__覆盖了,就没有can这个成员,所以报can不存在

 要解决上面这种情况

方法一:我们很多人都用过,但是这个方法其实不太好

class A:
    def __init__(self):
        print("i am A")
        self.can = True
    def sing(self):
        if can:
            print("a is singing")

class B(A):
    def __init__(self):
        A.__init__(self)
        print("i am B")
    def eat(self):
        print("b is eating")

h = B()
h.eat()     # 正确执行
h.sing()    # 正确执行

方法二:用super

class A:
    def __init__(self):
        print("i am A")
        self.can = True
    def sing(self):
        if can:
            print("a is singing")

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print("i am B")
    def eat(self):
        print("b is eating")

h = B()
h.eat()     # 正确执行
h.sing()    # 正确执行

按类名访问就相当于C语言之前的GOTO语句...乱跳,然后再用super按顺序访问..就有问题了

所以建议就是要么一直用super,要么一直用按照类名访问

检验一个类是否为新式类:

issubclass(classname,object),True则为新式类,False则不是新式类

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值