调用__new__
方法时遇到困难。你知道吗
在创建A()的实例时,如果输入值小于10,则返回B()
的实例。但是实例是在没有运行__new__
或__init__
方法的情况下创建的,这是为什么?你知道吗
class A (object):
def __init__ (self, IP, s):
print 'arrived to init a'
self.IP=IP
print self.IP
print s
def __new__ (cls, IP, s):
print "arrived to new a"
if IP>10:
self = object.__new__ (cls)
return self # return n
else:
return super (cls, A).__new__ (B)
class B(object):
def __init__(self,d,s,ar):
print 'arrived to b'
self.ip=d
print self.ip
print s
print ar
def __new__(cls,d,s,ar):
print 'arrived to new b'
self = object.__new__(cls)
return self # return n
def __repr__(self):
return 'B({}, ..., ...)'.format(getattr(self, 'ip', '<missing>'))
a = A(10 ,"a")
print a
这个输出
arrived to new a
B(<missing>, ..., ...)
而不是
arrived to new a
arrived to new b
arrived to b
10
'a'
?
B(10, ..., ...)
您要求
object.__new__
在此处创建一个新实例:所以} documentation :
A.__new__
在这里返回一个B()
的实例,而因为它返回一个新的B()
实例,而不是一个新的A()
实例,B.__init__()
将永远不会被调用;类型需要匹配。参见^{B()
不是A
的实例,因此不调用__init__
。B.__new__
未被调用,因为您通过请求object.__new__
创建实例来显式绕过它。你知道吗直接在
A.__new__
中调用B()
:您需要传入三个参数;我为第三个参数编了
42
。你知道吗因为调用了
B()
,所以将调用B.__new__
。因为B.__new__
返回B
的实例,所以__init__
方法也将被调用。你知道吗演示:
相关问题 更多 >
编程相关推荐