Python __新建和初始化__
可能重复:Python __新建和初始化__,python,Python,可能重复: 我试图理解如何使用这两种方法。我知道\uuuuu new\uuuuu用于创建对象,而\uuuu init\uuuu用于初始化。但我不确定创建对象时会发生什么 这是否意味着\uuuu new\uuuu和\uuuu init\uuuu必须具有相同的参数 如果我不使用相同的参数会发生什么 对 你会得到一个错误 (从技术上讲,对于\uuuuuu new\uuuuuu来说,第一个参数是类,而对于\uuuuuu init\uuuuuu来说,第一个参数是实例。但是,它们必须都能够接受相同的参数,
我试图理解如何使用这两种方法。我知道
\uuuuu new\uuuuu
用于创建对象,而\uuuu init\uuuu
用于初始化。但我不确定创建对象时会发生什么
\uuuu new\uuuu
和\uuuu init\uuuu
必须具有相同的参数\uuuuuu new\uuuuuu
来说,第一个参数是类,而对于\uuuuuu init\uuuuuu
来说,第一个参数是实例。但是,它们必须都能够接受相同的参数,因为除了第一个参数之外,传递给\uuuuuu init\uuuuuuuuu
的参数与传递给的参数相同。)__新的
)
>>类Foo(对象):
…定义新(cls,x):
…返回超级(Foo,cls)。\uuu新建\uuuu(cls)
...
…定义初始化(self,x,y):
…通过
>>>傅(1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
傅(1)
TypeError:\uuuu init\uuuuuu()正好接受3个参数(给定2个)
>>>傅(1,2)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
傅(1,2)
TypeError:\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
这两个方法将被传递(几乎)相同的参数集,因此它们通常具有匹配的签名(相同的参数集)
我在这里说“差不多”,因为\uuuuuuuuuuuuu
方法作为第一个参数传递给类,而\uuuuuuuuu init\uuuuuuuuuu
方法传递的是\uuuuuuuuuuuuuuu新创建的实例的结果
在python中,您可以使用“通配符”参数;*args
和**关键字
(请参阅),这意味着\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新的
或\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
签名不匹配时会发生什么情况(考虑通配符参数)?向签名与传入的参数不匹配的任何python可调用函数传递参数时,会得到相同的结果;您会得到一个异常。部分由\uuuuuuuuuuuuuuuuu
和\uuuuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu>回答。这两个函数做了不同的事情,具有不同的参数。这是一个很好的概述。那么*另外,通过将x
参数传递到super(..)。\uuuu new\uuuu
您触发了一个弃用警告,混淆了OP。这就是为什么我说“两者必须能够接受相同的参数”。确实,您可以使用*args
和**kwargs
来避免参数列表完全相同,但对于任何函数都是如此。重要的一点是,相同的args被传递给两个函数,因此它们必须能够接受相同的内容。(感谢您注意到DeprecationWarning的内容,我修复了它。)
>>> class Foo(object):
... def __new__(cls, x):
... return super(Foo, cls).__new__(cls)
...
... def __init__(self, x, y):
... pass
>>> Foo(1)
Traceback (most recent call last):
File "<pyshell#260>", line 1, in <module>
Foo(1)
TypeError: __init__() takes exactly 3 arguments (2 given)
>>> Foo(1, 2)
Traceback (most recent call last):
File "<pyshell#261>", line 1, in <module>
Foo(1, 2)
TypeError: __new__() takes exactly 2 arguments (3 given)