ホームページ >バックエンド開発 >Python チュートリアル >Python 面接でよくある質問: __Init__ と __New__ の違い
Python クラス内で定義され、_ _ xx _ _ で終わるメソッドはすべてクラスの組み込みメソッドであり、マジック メソッドとも呼ばれます。
クラスの組み込みメソッドは、特定の条件が満たされたときに自動的にトリガーされます。ここでは、インスタンスの作成に関係する __init__ と __new__ を中心に説明します。
__init__(self): このメソッドは比較的よく知られており、Python クラスのデフォルトの初期化メソッド、つまりクラスが初期化されたときに実行されるメソッドです。インスタンス化されました。
__new__ の詳細な説明 メソッドの書き換えは非常に固定されており、通常は次のようになります。
def __new__(cls): return super().__new__(cls)
ここで、cls はクラス自体を表します。
__new__ メソッドを書き換えるためのコードは非常に固定されています。__new__ メソッドを書き換えるときは、super().__new__(cls) を返すか、object.__new__(cls) を返す必要があります。そうしないと、Python インタプリタが失敗します。割り当てられた領域を持つオブジェクトを参照する場合、オブジェクトの初期化メソッドは呼び出されません。例:
class Mycls: def __new__(cls): print('new') return super().__new__(cls) def __init__(self): print('init') my=Mycls()
出力:
new が init の前に出力され、__new__ が証明されていることがわかります。 (cls) は __init__(self) の前に実行されます。
コードを書き換えます:
def __new__(cls): print('new') my=Mycls() print(my)
出力:
次のことを確認できます。 __new__(cls) には戻り値がありません。インスタンスは返されず、__init__(self) は実行されません。
1. __new__() メソッドは、インスタンスの作成に使用されます。このメソッドは、クラスがインスタンス化される前に最初に呼び出されます。これはクラス メソッドであり、静的メソッドです。方法。 __init__() メソッドは、インスタンスを初期化するために使用されます。このメソッドは、インスタンス オブジェクトが作成された後に呼び出されます。これは、インスタンス オブジェクトのメソッドであり、クラス インスタンス オブジェクトのいくつかの初期値を設定するために使用されます。
2. __init__() メソッドと __new__() メソッドの両方がクラスに存在する場合、__new__() メソッドが最初に呼び出され、次に __init__() メソッドが呼び出されます。 __new__() メソッドは、インスタンス作成の最初のステップです。実行後、作成されたクラスのインスタンスを返す必要があります。返さないと、エラーが報告され、__init__() メソッドは実行できません。このうち、__init__() メソッドは情報を返しません。
学生の中には、__new__ を使用すると何が達成できるのかと尋ねる人もいます。
個人的には、シングルトンが最も古典的なアプリケーションだと思います。シングルトン パターンは一般的に使用されるソフトウェア デザイン パターンであり、このパターンの主な目的は、特定のクラスのインスタンスが 1 つだけ存在するようにすることです。シングルトン オブジェクトは、システム全体で特定のクラスのインスタンスを 1 つだけ表示したい場合に便利です。たとえば、システム内に複数の印刷タスクが存在する可能性がありますが、作業タスクは 1 つだけであることができ、システムは 1 つのウィンドウ マネージャまたはファイル システムを 1 つだけ持つことができ、システムは 1 つのタイミング ツールまたは ID (シリアル番号) ジェネレータを 1 つだけ持つことができます。
具体的な実装コードは次のとおりです:
class Mycls: _instance = None def __new__(cls): # 判断该类的属性是否为空;对第一个对象没有被创建,我们应该调用父类的方法,为第一个对象分配空间 if cls._instance == None: # 把类属性中保存的对象引用返回给python的解释器 cls._instance = object.__new__(cls) return cls._instance # 如果cls._instance不为None,直接返回已经实例化了的实例对象 else: return cls._instance def __init__(self): print('init') my1=Mycls() print(my1) my2=Mycls() print(my2)
出力:
init <__main__.Mycls object at 0x000000406E471148> Init <__main__.Mycls object at 0x000000406E471148>
my1 と my2 という名前ですが、どちらもオブジェクト 0x000000406E471148 であることがわかります。シングルトンモードの適用。
以上がPython 面接でよくある質問: __Init__ と __New__ の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。