__new__和__init__

5 python

可能重复:
Python使用__new__和__init__?

我试图了解如何使用这两种方法.我知道这__new__ 用于创建一个对象,同时__init__进行初始化.但是我不确定在创建对象时会发生什么.

  1. 这是否意味着__new____init__必须具有相同的参数?

  2. 如果我不使用相同的参数会发生什么?

Bre*_*arn 6

  1. 是.

  2. 你会收到一个错误.

(从技术上来说,__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)
Run Code Online (Sandbox Code Playgroud)

  • 那么 `*args` 和 `**kw` 又如何呢?另外,通过将“x”参数传递给“super(..).__new__”,您将触发 DeprecationWarning,从而使操作变得混乱。 (2认同)

Mar*_*ers 5

两种方法都将(几乎)传递相同的参数集,因此通常它们具有匹配的签名(相同的参数集).

我说'几乎'在那里,因为该__new__方法作为第一个参数传递给类,而__init__方法传递给方法的结果__new__; 新创建的实例.

在python中,您可以使用"通配符"参数; 在*args**keyword(见什么做的*指定参数和**kwargs是什么意思?),这意味着无论是__new____init__可以使用这些仅命名了一些传入的参数.

签名不匹配时会发生什么(考虑到通配符参数)?你得到的结果与将参数传递给任何python callable的结果相同,python的callable的签名与传入的参数不匹配; 你得到一个例外.