在Python2.7.12中,\uu new_Uu()不返回类的实例时的继承

2024-09-28 22:26:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我读过一篇关于__new__()在stackoverflowInheritance when __new__() doesn't return instance of class上不返回类的实例的文章,我知道这个问题是针对python3的。正如Martijn Pieters所说,它可以通过name mangling来完成,并直接在类中手动调用它,然后在类中初始化它。在

我想用python2.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

第二次尝试:

^{pr2}$

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

为什么会发生这种情况,这是在Python2.7.12中实现的,还是这种技术不兼容?在


Tags: 方法selfnewreturndefclassclswhen
1条回答
网友
1楼 · 发布于 2024-09-28 22:26:07

在第一次尝试中,您传递的是一个旧样式的类对象,但是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__需要两个参数,但只有{}被传入。在

相关问题 更多 >