python子类实例化的时候父类的__new__会被调用吗?

本文通过一系列测试代码探讨了Python中类的__new__方法调用规则,以及多继承下的方法解析顺序(MRO)。实验表明,Python在实例化子类时,会按照MRO顺序查找__new__方法,一旦找到则不再继续搜索。测试涵盖了单继承和多继承两种情况,验证了MRO在内置方法解析过程中的作用。

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

测试代码:

class A:
    def __new__(cls):
        print("testA")
class B(A):
    def __new__(cls):
        print("testB")

class C(B):
    pass

D=C()

测试结果:

testB

这说明子类实例化的时候,会调用父类的__new__方法,但是不会调用祖先的__new__方法。

class A:
    def __new__(cls):
        print("testA")
class B(A):
    pass

class C(B):
    pass

D=C()

测试结果:

testA

这说明,如果父类么有实现__new__方法,那么就会继续沿着继承链往上寻找祖先的__new__方法,一旦找到就立即调用,然后停止寻找。

假设子类实现了__new__方法,那么父类的__new__方法还会被调用吗?

class A:
    def __new__(cls):
        print("testA")
class B(A):
    def __new__(cls):
        print("testB")

class C(B):
    def __new__(cls):
        print("testC")

D=C()

测试结果:

testC

这说明子类实现了__new__方法,那么父类的__new__方法就不会被调用了,python会调用子类的__new__方法。

于是,可以证明在单继承情况下:

python的内置方法的resolution的过程,实际上也是遵循继承关系的,即在子类中找不到的内置方法,就按照__MRO__的顺序去寻找对应的内置方法,然后调用。

上面的测试只是单继承情况,证据还不多,来测试一下多继承的情况。

多继承下的__new__方法是按照继承关系来确定的吗?

class A:
    def __new__(cls):
        print("testA")
class B:
    def __new__(cls):
        print("testB")

class C(A,B):
    def __new__(cls):
        print("testC")

print(C.__mro__)
D=C()

测试结果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
testC

这个测试代码中,实际上是按照MRO顺序寻找的。

class A:
    def __new__(cls):
        print("testA")
class B:
    def __new__(cls):
        print("testB")

class C(A,B):
    pass

print(C.__mro__)
D=C()

测试结果:

(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
testA

该例中,也是按照MRO顺序寻找的。

总结:

pyhton子类的__new__方法是按照MRO顺序寻找的,一旦确定__new__,就停止寻找。

其实,python的任何内置方法都是按照MRO顺序寻找的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值