__init__
function in pythonはコンストラクターではなく、イニシャライザーであり、実際には__new__
関数はコンストラクターであり、違いは__init__
関数は、オブジェクトの作成後に呼び出され、__new__
前に呼び出されました。私は正しいですか?違いをよりよく説明できますか、なぜ両方が必要なのですか__new__
および__init__
?
本質的に、__new__
はインスタンスの作成に責任があります(したがって、あなたが指摘したように、それはコンストラクターと言うのが正確かもしれません)が、__init__
は確かにインスタンスの状態を初期化する方法。たとえば、次のことを考慮してください。
class A(object):
def __new__(cls):
return object.__new__(cls)
def __init__(self):
self.instance_method()
def instance_method(self):
print 'success!'
newA = A()
__init__
は引数self
を受け取り、__new__
はクラス(cls
)を受け取ることに注意してください。 self
はインスタンスへの参照であるため、これは、インスタンスが渡されるため、__init__
が呼び出されるまでにインスタンスがすでに作成されていることを明確に示しているはずです。インスタンスがすでに作成されているため、インスタンスメソッドを呼び出すこともできます。
2番目の質問に関しては、私の経験では__new__
を使用する必要はめったにありません。確かに、より高度な手法で__new__
を使用する場合もありますが、それはまれです。人々が__new__
を使いたくなるかもしれない悪名高い例の1つは、シングルトンクラスの作成です(ただし、それが優れた手法であるかどうかは重要ではありません)。
良くも悪くも、基本的にインスタンス化のプロセスを制御することができ、それが特定の状況で意味するものは何でも。
__init__
は、オブジェクトのすでに構築されたインスタンスを最初のパラメーターとして使用して呼び出されます(通常はself
と呼ばれますが、これは単なるパラメーター名です)。
代わりに、__new__
は、最初のパラメーターとしてclassを渡すことで呼び出され、インスタンスを返すことが期待されます(後で__init__
に渡されます)。
これにより、たとえば__new__
は、不変でIDが役割を果たさない値ベースのオブジェクトの既存のインスタンスを返すことができます。
詳細については、 クラスのカスタマイズに関するドキュメント を検討してください。
それに応じて、これらのメソッドは次のように使用されます。オブジェクトを作成するための__new__()
、およびオブジェクトをカスタマイズするための__init__()
。
そして6502が気づいたように、__new__
は静的メソッドの特殊なケースであり、引数としてクラスを取得しますが、__init__
は__new__
によって生成されたオブジェクトを取得します