Python の魔法のメソッド

Patricia Arquette
リリース: 2024-12-31 09:03:14
オリジナル
434 人が閲覧しました

Python

1 -> __new__(cls) メソッド

Python で新しいオブジェクトが作成されると、__new__ メソッドが呼び出されます。これは、クラスの新しいインスタンスを作成して返すを担当します。このメソッドは通常、シングルトン パターン、キャッシュ、メモリ管理などオブジェクトの作成をカスタマイズする場合に使用されます。

__new__ はいつ呼び出されますか?

__new__ メソッドは __init__ のに呼び出され、新しいオブジェクトの作成に使用されます。新しいオブジェクトを作成するときの一般的なイベントの順序は次のとおりです:

  1. __new__: オブジェクトを作成します (メモリ割り当て)。
  2. __init__: オブジェクトを初期化します (属性を設定します)。

__new__ の使用例:

  1. シングルトン パターン: シングルトン パターンでは、クラスのインスタンスが 1 つだけ存在することが保証されます。この場合、 __new__ は、新しいインスタンスを作成するのではなく、インスタンスがすでに存在するかどうかを確認し、それを再利用します。
   class Singleton:
       _instance = None

       def __new__(cls):
           if cls._instance is None:
               cls._instance = super(Singleton, cls).__new__(cls)
           return cls._instance

   s1 = Singleton()
   s2 = Singleton()
   print(s1 is s2)  # True, both are the same instance
ログイン後にコピー
  1. オブジェクトのキャッシュ: 特定の条件に基づいてオブジェクトをキャッシュしたい場合は、新しいオブジェクトを作成する前に、__new__ を使用してオブジェクトが既に存在するかどうか (辞書などに) を確認できます。これはメモリ使用量の最適化に役立ちます。
   class CachedObject:
       _cache = {}

       def __new__(cls, value):
           if value in cls._cache:
               return cls._cache[value]
           obj = super().__new__(cls)
           cls._cache[value] = obj
           return obj

   obj1 = CachedObject("hello")
   obj2 = CachedObject("hello")
   print(obj1 is obj2)  # True, the same object is reused
ログイン後にコピー
  1. メモリ管理:
    オブジェクトのメモリ割り当てを制御したい場合 (メモリ使用量の最適化や大きなオブジェクトの管理など)、__new__ を使用してオブジェクトの作成方法をカスタマイズできます。

  2. 不変オブジェクト:
    __new__ は、タプルや文字列などの不変オブジェクトでよく使用されます。たとえば、カスタムの不変オブジェクトを作成する場合は、__new__ をオーバーライドして、オブジェクトが適切に作成されるようにします。

   class MyTuple(tuple):
       def __new__(cls, *args):
           return super().__new__(cls, args)

   t = MyTuple(1, 2, 3)
   print(t)  # (1, 2, 3)
ログイン後にコピー

要約すれば:

  • __new__ はオブジェクトの作成時に呼び出され、クラスのインスタンスを返すを担当します。
  • オブジェクト作成の最適化、シングルトンなどのパターンの実装、オブジェクト キャッシュの管理、さらにはメモリ割り当てのカスタマイズにも役立ちます。プロセス。

以上がPython の魔法のメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート