这是Python 3代码:
class Class:
def __new__(cls, value):
print(__class__, cls, value)
return Subclass(value+1, value+2)
class Subclass(Class):
def __new__(cls, value, value2):
print(__class__, cls, value, value2)
return object.__new__(Subclass)
def __init__(self, *args):
print(args)
self.value = args
acctual_instance = Class(1)
print('acctual_instance:', acctual_instance.value, type(acctual_instance))
输出:
<class '__main__.Class'> <class '__main__.Class'> 1
<class '__main__.Subclass'> <class '__main__.Subclass'> 2 3
(2, 3)
(1,)
acctual_instance: (1,) <class '__main__.Subclass'>
即使我们从Subclass(2,3)
返回了Class.__new__(1)
个实例,acctual_instance.value
也是Class
'参数1,而不是(2,3)。这是预期的行为吗?为什么Subclass.__init__()
第二次被召唤?如何从Subclass(2,3)
返回Class.__new__(1)
个实例?
更新:
如果从类Class
中删除Subclass(Class)
,则输出为:
<class '__main__.Class'> <class '__main__.Class'> 1
<class '__main__.Subclass'> <class '__main__.Subclass'> 2 3
(2, 3)
acctual_instance: (2, 3) <class '__main__.Subclass'>
答案 0 :(得分:0)
__new__()
上的文档quite explicit就此而言:
典型的实现通过使用带有适当参数的
__new__()
调用超类的super(currentclass, cls).__new__(cls[, ...])
方法创建类的新实例,然后在返回之前根据需要修改新创建的实例。 / p>
这是因为类初始化Class(1)
或多或少等于
obj = Class.__new__(Class, 1)
obj.__init__(1)
在您的代码中,您在__new__()
return Subclass(value+1, value+2)
这会调用obj2 = Subclass.__new__(cls, value + 1, value + 2)
,然后调用obj2.__init__(value + 1, value + 2)
,然后返回obj2
。
此后,在obj.__init__(1)
返回之后调用__new__()
,如上所述:使用原始参数(__init__()
)调用第二个1
。因此value == 1
。第一个构造函数调用设置的初始值将被第二个构造函数调用覆盖。
您的代码的改进版本可能是
class Class:
def __new__(cls, value):
return Subclass.__new__(cls, value + 1, value + 2)
class SubClass(Class):
def __new__(cls, value1, value2):
return object.__new__(Subclass)
def __init__(self, *args):
print(args)
instance = Base(1)
print(type(instance))
但请注意,该版本不会对value1
和value2
传递给Subclass.__new__()
。
另请注意,在Subclass.__init__()
中,您还应调用super().__init__()