重複の可能性:
Python の __new__ と __init__ の使用?
2つの方法の使用方法を理解しようとしています。__new__
初期化中にオブジェクトを作成するために使用されることを知ってい__init__
ます。しかし、オブジェクトを作成するとどうなるかわかりません。
__new__
と__init__
は同じパラメータを持つ必要があるということですか?同じパラメーターを使用しないとどうなりますか?
重複の可能性:
Python の __new__ と __init__ の使用?
2つの方法の使用方法を理解しようとしています。__new__
初期化中にオブジェクトを作成するために使用されることを知ってい__init__
ます。しかし、オブジェクトを作成するとどうなるかわかりません。
__new__
と__init__
は同じパラメータを持つ必要があるということですか?
同じパラメーターを使用しないとどうなりますか?
はい。
エラーが発生します。
(技術的には__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)
両方のメソッドには(ほぼ)同じ引数のセットが渡されるため、通常、それらには一致するシグニチャー(同じパラメーターのセット)があります。
__new__
メソッドには最初の引数としてクラスが渡され、__init__
メソッドにはメソッドの結果が渡されるため、ここでは「ほぼ」と言い__new__
ます。新しく作成されたインスタンス。
Pythonでは、「ワイルドカード」パラメータを使用できます。および(*argsおよび**kwargsの意味を参照)。*args
これは、これらを使用して、渡されたパラメーターの一部にのみ名前を付けることができることを意味します。**keyword
__new__
__init__
署名が一致しない場合はどうなりますか(ワイルドカードパラメーターを考慮に入れて)?渡された引数と署名が一致しないPython呼び出し可能オブジェクトに引数を渡すのと同じ結果が得られます。例外が発生します。