当uuu new uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;t在python 2.7.12中返回类的实例
我一直在读关于当uuu new uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;t在python 2.7.12中返回类的实例,python,python-2.7,constructor,Python,Python 2.7,Constructor,我一直在读关于\uuuuu new\uuuuu()何时不返回stackoverflow上的类实例的文章,我知道这个问题是针对Python3的。正如Martijn Pieters所说,它可以通过在类中直接手动调用并在类中完全初始化来完成 我想在Python2.7.12中尝试一下。我可以管理第一种和第二种方法,但第三种方法会产生TypeError 这是我的代码,第一次尝试: class A: def __new__(cls, p1, p2): self = object.__
\uuuuu new\uuuuu()
何时不返回stackoverflow上的类实例的文章,我知道这个问题是针对Python3的。正如Martijn Pieters所说,它可以通过在类中直接手动调用并在类中完全初始化来完成
我想在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()参数1必须是type,而不是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:\uuuuu new\uuuuu()正好接受2个参数(给定1个)
为什么会发生这种情况,这可以在python 2.7.12中实现,还是这项技术不兼容?在您的第一次尝试中,您传入了一个旧样式的类对象,但是
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>]
>>A类(对象):
... 定义新(cls、p1、p2):
... self=object.\uuuuu new\uuuu(cls)
... self.p1=p1
... self.p2=p2
... 返回[自我]
...
>>>B(A)类:
... 定义新的(cls,p3):
... self=super(B,cls)。\uuuu新的\uuuuu(cls,1,2)
... 自我[0]。p3=p3
... 回归自我
...
>>>B()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
>>>B(42)
[]
您的错误告诉您,
B.\uuuuu new\uuuuu
需要两个参数,但只传入了cls
。您的第二次尝试对我来说很好。您忘记传递参数了吗?另一个问题是,当子类具有不同数量的参数时,如何调用\uuuuu init\uuu()
,因为通常只调用一次\uuuu init\uuu
。您在这里什么也没做,这只是简单的重写。是的,我忘了传递参数哦,我明白了,先生,这是因为我调用类B实例时没有p3参数B()返回“TypeError:\uuuuu new\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。谢谢你,先生