无法从Class .__ new __()返回Subclass实例

时间:2015-03-27 17:07:18

标签: class python-3.x instance python-3.4

这是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'>

1 个答案:

答案 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))

但请注意,该版本不会对value1value2传递给Subclass.__new__()

另请注意,在Subclass.__init__()中,您还应调用super().__init__()