11

私は何をするか__new__(そして とどのように違うか__init__) を理解しているので、定義には興味がありません。いつ、どのように を使用するかに興味があります__new__

ドキュメントには次のように記載されています。

一般に、 、、または__new__のような不変型をサブクラス化しない限り、オーバーライドする必要はありませんstrintunicodetuple

しかし、使用する他のケース__new__やそれを正しく使用する方法については考えられません (たとえば、不変型をサブクラス化する場合や、この場合に必要な理由など)。

では、いつ、なぜ、どのように使用する必要があるの__new__でしょうか?

私はそれが何をするかではなく、ユースケースに興味があります(私はそれが何をするかを知っています)。

4

2 に答える 2

13

自分で答えて、私はそれを使って

  • シングルトンパターンを作成します(ただし、を使用せずにそれを行う方法__new__はあります)
  • ソースを実際に編集せずに、外部モジュールからクラスを動的に拡張します
  • メタクラスのクラスをカスタマイズします(__call__私が思うに使用することもできます)
  • クラス(不変)を拡張して、datetime.datetime引数なしでインスタンス化された場合は現在の時刻を返し、strptime単一の文字列引数で呼び出された場合は引数を呼び出した結果を返します

例で必要な__new__ように、不変型の構築に使用される引数を変更するdatetime場合、または親__new__をまったく呼び出さずに別の方法で作成されたインスタンスを返す場合、またはまったく異なるタイプ。そこにいるときには__init__、オブジェクトを変更するには遅すぎるので、で行う必要があります__new__

于 2012-10-11T08:47:02.247 に答える
1

潜在的なユースケースは、実装に応じてさまざまなクラスのインスタンスを返す「ファクトリクラス」である可能性があります。

于 2012-10-11T08:46:25.587 に答える