Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当uuu new uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;t在python 2.7.12中返回类的实例_Python_Python 2.7_Constructor - Fatal编程技术网

当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。谢谢你,先生