ドキュメントは、とは異なるタイプのオブジェクトを返しても問題がないことを示しています。その場合は呼び出されないということです。明示的には述べられていませんが、常識または簡単なテストにより、結果のオブジェクトにタイプがないことが確認されます。__new__(cls, ...)
cls
__init__()
cls
なぜこの一見奇妙な振る舞いが許されるのですか?ユースケースは何ですか?それは明らかに意図的なものです。
ドキュメントは、とは異なるタイプのオブジェクトを返しても問題がないことを示しています。その場合は呼び出されないということです。明示的には述べられていませんが、常識または簡単なテストにより、結果のオブジェクトにタイプがないことが確認されます。__new__(cls, ...)
cls
__init__()
cls
なぜこの一見奇妙な振る舞いが許されるのですか?ユースケースは何ですか?それは明らかに意図的なものです。
単体テスト用のモックオブジェクトを作成するときに便利です。
場合によっては、残りのコードを変更せずに、元のオブジェクトと同じインターフェイスを持つ他のオブジェクトを返すようにメソッドを変更でき__new__
ます(たとえば、元のクラスインスタンスの動作をシミュレートします)。
__new__(cls, ...)
Pythonの人々は、のインスタンスを返すように強制する理由はないと判断したと思いますcls
。 __new__
はかなり高度な方法であるため、ユーザーはおそらく自分が何をしているのかを知っており、この動作を悪用する理由がいくつかある可能性があります。
しかし、彼らはまだチェックをしなければなりません。インスタンスの作成中に、__init__
を呼び出す必要があります。__new__
これは、インスタンス(から返される)が実際にである場合にのみ合理的ですcls
。何か別のものを返す場合__new__
、オブジェクトがに渡される引数を処理できない可能性があります__init__
。
結局、__new__
言語への追加により、開発者は次の3つの選択肢を得ることができました。
__new__(cls, ...)
のインスタンスを返すように強制しますcls
__init__
によって返されるインスタンスを常に呼び出し__new__
、オブジェクトが引数を処理できることを確認するのはユーザーに任せます。__init__
インスタンスが実際にのインスタンスである場合にのみ呼び出しますcls
。オプション3が最も実用的だと思います。