【python】哪位大侠给解释一下这个例子,关于__new__
class A(object):
def __new__(cls, *args, **kwds):
print "one"
print "A.__new__", args, kwds
return object.__new__(B, *args, **kwds)
def __init__(cls, *args, **kwds):
print "two"
print "A.__init__", args, kwds
class B(object):
def __new__(cls, *args, **kwds):
print "three"
print cls
print B
print "B.__new__", args, kwds
return object.__new__(cls, *args, **kwds)
def __init__(cls, *args, **kwds):
print "four"
print "B.__init__", args, kwds
print A()
print "====================="
print B()
我的问题是:
为什么 return object.__new__(B, *args, **kwds) 没有输出
return object.__new__(cls, *args, **kwds)
会返回B的实例。
object.__new__这个东西到底是什么?
[最优解释]
之前是看懂了, 现在又忘了, 说明我根本用不到__new__。
[其他解释]
随便改了一个字母。
class A(object):
def __new__(cls, *args, **kwds):
print "one"
print "A.__new__", args, kwds
return object.__new__(B, *args, **kwds)
def __init__(cls, *args, **kwds):
print "two"
print "A.__init__", args, kwds
class B(A):
def __new__(cls, *args, **kwds):
print "three"
print cls
print B
print "B.__new__", args, kwds
return A.__new__(cls, *args, **kwds)
def __init__(cls, *args, **kwds):
print "four"
print "B.__init__", args, kwds
print A()
print "====================="
print B()
结果更奇葩了。小弟愚钝 搞不定了。。。
[其他解释]
又改了一下
class A(object):
def __new__(cls, *args, **kwds):
print "one"
print "A.__new__", args, kwds
## return object.__new__(B, *args, **kwds)
def __init__(cls, *args, **kwds):
print "two"
print "A.__init__", args, kwds
class B(A):
def __new__(cls, *args, **kwds):
print "three"
print cls
print B
print "B.__new__", args, kwds
return A.__new__(cls, *args, **kwds)
def __init__(cls, *args, **kwds):
print "four"
print "B.__init__", args, kwds
print A()
print "====================="
print B()
忽然发现
>>> object.__new__(B)
<__main__.B object at 0x028646B0>
>>> object.__new__(A)
<__main__.A object at 0x02864C30>
也就是说new会迭代找父类的new(如果没一个new都return super(currentcls,cls)最后返回的 最开始调用的那个类的实例)
[其他解释]
>>> object.__new__(B)
<__main__.B object at 0x028646B0>
>>> object.__new__(A)
<__main__.A object at 0x02864C30>
为什么会这样呢?
[其他解释]
原来是这样,那我也不弄了 反正就是个爱好。
感谢你回帖 我终于可以结贴了!