我一直在阅读当__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中实现,还是这种技术不兼容?
答案 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
。