__new __()在python 2.7.12中不返回类的实例时的继承

时间:2016-11-16 10:37:31

标签: python python-2.7 constructor

我一直在阅读当__new__()没有在stackoverflow Inheritance when __new__() doesn't return instance of class上返回类的实例时我知道这个问题是针对python 3.正如Martijn Pieters所说,它可以通过{ {3}}并直接在类中手动调用它,并在类中完全初始化它。

我想在python 2.7.12中尝试一下。我可以管理的第一种和第二种方法,但对于第三种方法,我会提出TypeError

这是我的代码,第一次尝试:

class A:
    def __new__(cls, p1, p2):
        self = object.__new__(cls)
        self.p1 = p1
        self.p2 = p2
        return [self]

class B(A):
    def __new__(cls, p3):
        self = super(B,cls).__new__(cls,1,2)
        self[0].p3 = p3
        return self

这给了我TypeError: super() argument 1 must be type, not classobj

第二次尝试:

class A(object):
    def __new__(cls, p1, p2):
        self = object.__new__(cls)
        self.p1 = p1
        self.p2 = p2
        return [self]  #return not instance

class B(A):
    def __new__(cls, p3):
        self = super(B,cls).__new__(cls,1,2)
        self[0].p3 = p3
        return self

这给了我TypeError: __new__() takes exactly 2 arguments (1 given)

为什么会发生这种情况,这可以在python 2.7.12中实现,还是这种技术不兼容?

1 个答案:

答案 0 :(得分:1)

在您第一次尝试时,您传递的是旧式类对象,但super()只接受新式类。

您需要从object继承以获得一个新式的课程,这是您在第二次尝试时正确执行的课程。在创建实例时,您只是忘记传入参数

>>> class A(object):
...     def __new__(cls, p1, p2):
...         self = object.__new__(cls)
...         self.p1 = p1
...         self.p2 = p2
...         return [self]
...
>>> class B(A):
...     def __new__(cls, p3):
...         self = super(B, cls).__new__(cls, 1, 2)
...         self[0].p3 = p3
...         return self
...
>>> B()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __new__() takes exactly 2 arguments (1 given)
>>> B(42)
[<__main__.B object at 0x10241fa90>]

您的错误告诉您B.__new__想要两个参数,但只传递了cls