测试代码:
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顺序寻找的。