我正在尝试了解如何使用这两种方法。我知道__new__
用于创建对象,而__init__
用于初始化。但是我不确定在创建对象时会发生什么。
这是否意味着__new__
和__init__
必须具有相同的参数?
如果我不使用相同的参数会怎样?
答案 0 :(得分:6)
是
您将收到错误。
(从技术上来说,__new__
第一个参数是类,而__init__
第一个参数是实例。但是,它们必须都能够接受相同的参数,因为,除了第一个参数之外,传递给__init__
的参数与传递给__new__
的参数相同。)
>>> 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)
答案 1 :(得分:5)
两种方法都将(几乎)传递相同的参数集,因此通常它们具有匹配的签名(相同的参数集)。
我说“差不多”,因为__new__
方法作为第一个参数传递给类,而__init__
方法传递__new__
方法的结果;新创建的实例。
在python中,可以使用“通配符”参数; *args
和**keyword
(请参阅What do *args and **kwargs mean?),这意味着__new__
或__init__
可以使用这些来命名 some 传入的参数。
当签名不匹配时(考虑到通配符参数)会发生什么?你得到的结果与将参数传递给任何python callable的结果相同,python的callable的签名与传入的参数不匹配;你得到一个例外。