ホームページ >バックエンド開発 >Python チュートリアル >Python 面接でよくある質問: __Init__ と __New__ の違い

Python 面接でよくある質問: __Init__ と __New__ の違い

PHPz
PHPz転載
2023-04-12 14:31:061512ブラウズ

Python 面接でよくある質問: __Init__ と __New__ の違い

Python クラス内で定義され、_ _ xx _ _ で終わるメソッドはすべてクラスの組み込みメソッドであり、マジック メソッドとも呼ばれます。

クラスの組み込みメソッドは、特定の条件が満たされたときに自動的にトリガーされます。ここでは、インスタンスの作成に関係する __init__ と __new__ を中心に説明します。

簡単な説明__init__

__init__(self): このメソッドは比較的よく知られており、Python クラスのデフォルトの初期化メソッド、つまりクラスが初期化されたときに実行されるメソッドです。インスタンス化されました。

__new__

__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 が init の前に出力され、__new__ が証明されていることがわかります。 (cls) は __init__(self) の前に実行されます。

コードを書き換えます:

def __new__(cls):
 print('new')
my=Mycls()
print(my)

出力:

  • new
  • None

次のことを確認できます。 __new__(cls) には戻り値がありません。インスタンスは返されず、__init__(self) は実行されません。

__new__ と __init__

1. __new__() メソッドは、インスタンスの作成に使用されます。このメソッドは、クラスがインスタンス化される前に最初に呼び出されます。これはクラス メソッドであり、静的メソッドです。方法。 __init__() メソッドは、インスタンスを初期化するために使用されます。このメソッドは、インスタンス オブジェクトが作成された後に呼び出されます。これは、インスタンス オブジェクトのメソッドであり、クラス インスタンス オブジェクトのいくつかの初期値を設定するために使用されます。

2. __init__() メソッドと __new__() メソッドの両方がクラスに存在する場合、__new__() メソッドが最初に呼び出され、次に __init__() メソッドが呼び出されます。 __new__() メソッドは、インスタンス作成の最初のステップです。実行後、作成されたクラスのインスタンスを返す必要があります。返さないと、エラーが報告され、__init__() メソッドは実行できません。このうち、__init__() メソッドは情報を返しません。

__new__ の応用__

学生の中には、__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 サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。