Python で新しいオブジェクトが作成されると、__new__ メソッドが呼び出されます。これは、クラスの新しいインスタンスを作成して返すを担当します。このメソッドは通常、シングルトン パターン、キャッシュ、メモリ管理などオブジェクトの作成をカスタマイズする場合に使用されます。
__new__ メソッドは __init__ の前に呼び出され、新しいオブジェクトの作成に使用されます。新しいオブジェクトを作成するときの一般的なイベントの順序は次のとおりです:
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
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
メモリ管理:
オブジェクトのメモリ割り当てを制御したい場合 (メモリ使用量の最適化や大きなオブジェクトの管理など)、__new__ を使用してオブジェクトの作成方法をカスタマイズできます。
不変オブジェクト:
__new__ は、タプルや文字列などの不変オブジェクトでよく使用されます。たとえば、カスタムの不変オブジェクトを作成する場合は、__new__ をオーバーライドして、オブジェクトが適切に作成されるようにします。
class MyTuple(tuple): def __new__(cls, *args): return super().__new__(cls, args) t = MyTuple(1, 2, 3) print(t) # (1, 2, 3)
以上がPython の魔法のメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。