7

重複の可能性:
Python の __new__ と __init__ の使用?

2つの方法の使用方法を理解しようとしています。__new__ 初期化中にオブジェクトを作成するために使用されることを知ってい__init__ます。しかし、オブジェクトを作成するとどうなるかわかりません。

  1. __new____init__は同じパラメータを持つ必要があるということですか?

  2. 同じパラメーターを使用しないとどうなりますか?

4

2 に答える 2

8
  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)
于 2012-08-03T05:51:46.983 に答える
6

両方のメソッドには(ほぼ)同じ引数のセットが渡されるため、通常、それらには一致するシグニチャー(同じパラメーターのセット)があります。

__new__メソッドには最初の引数としてクラスが渡され、__init__メソッドにはメソッドの結果が渡されるため、ここでは「ほぼ」と言い__new__ます。新しく作成されたインスタンス。

Pythonでは、「ワイルドカード」パラメータを使用できます。および(*argsおよび**kwargsの意味を参照)*argsこれは、これらを使用して、渡されたパラメーターの一部にのみ名前を付けることができることを意味します。**keyword__new____init__

署名が一致しない場合はどうなりますか(ワイルドカードパラメーターを考慮に入れて)?渡された引数と署名が一致しないPython呼び出し可能オブジェクトに引数を渡すのと同じ結果が得られます。例外が発生します。

于 2012-08-03T05:59:00.507 に答える