マジック メソッドは Python の組み込み関数であり、通常、__init__、__del__ など、二重アンダースコアで始まり、終わります。これらのメソッドは、特定の操作を実行するときに自動的に呼び出されることから、マジック メソッドと呼ばれます。
Python では、 dir() メソッドを使用して、オブジェクトのすべてのメソッドと属性を表示できます。二重アンダースコアで始まり、終わるマジック メソッドは、オブジェクトのマジック メソッドです。文字列オブジェクトを例に挙げます:
>>> dir("hello") ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mo d__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'isl ower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', ' rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate' , 'upper', 'zfill']
文字列オブジェクトには __add__ メソッドがあることがわかり、Python では文字列オブジェクトに対して " " 操作を直接使用できます。Python が " " 操作を認識すると、 , オブジェクトの __add__ メソッドが呼び出されます。必要に応じて、独自のクラスの __add__ メソッドをオーバーライドして、目的の効果を実現できます。
class A(object): def __init__(self, str): self.str = str • def __add__(self, other): • print ('overwrite add method') • return self.str + "---" + other.str >>>a1 = A("hello") >>>a2 = A("world") >>>print (a1 + a2) >>>overwrite add method >>>"hello---world"
__add__ メソッドを書き換えました。Python が " " 操作を認識すると、書き換えられた __add__ メソッドが自動的に呼び出されます。ご覧のとおり、マジック メソッドはクラスまたはオブジェクトの特定のイベントがトリガーされた後に自動的に実行されますが、独自のプログラムに合わせて特別な機能を備えたクラスをカスタマイズしたい場合は、これらのメソッドを書き直す必要があります。マジック メソッドを使用すると、特別な関数をクラスに簡単に追加できます。
__new__、__init__ これら 2 つのマジック メソッドは、クラスを初期化するためによく使用されます。上記で a1 = A("hello") を作成したとき、最初に呼び出したのは __new__ でした。クラスの初期化は 2 つのステップに分かれています:
__new__(cls, *args, **kwargs) には少なくとも 1 つの cls パラメータが必要です、渡されたクラスを表します。最後の 2 つのパラメータは __init__ に渡されます。 __new__ では、__init__ メソッドの呼び出しを続行するかどうかを決定できます。__new__ が現在のクラス cls のインスタンスを返した場合にのみ、__init__ が呼び出されます。 __new__ メソッドの特性と組み合わせると、__new__ メソッドをオーバーライドすることで Python のシングルトン モードを実装できます。
class Singleton(object): def __init__(self): print("__init__") • def __new__(cls, *args, **kwargs): • print("__new__") • if not hasattr(Singleton, "_instance"): • print("创建新实例") • Singleton._instance = object.__new__(cls) • return Singleton._instance >>> obj1 = Singleton() >>> __new__ >>> 创建新实例 >>> __init__ >>> obj2 = Singleton() >>> __new__ >>> __init__ >>> print(obj1, obj2) >>> (<__main__.Singleton object at 0x0000000003599748>, <__main__.Singleton object at 0x0000000003599748>)
2 つのオブジェクトが作成されますが、オブジェクトのアドレスは 2 つであることがわかります。同じだ。
メソッドは主に、オブジェクトのプロパティにアクセス、定義、変更するときに機能します。主なものは次のとおりです。
マジック メソッド self.__setattr__(name,values) は、self.a=a などの属性を初期化するとき、または ins.a=1 などのインスタンス属性を変更するときに、インスタンスが属性にアクセスするときに呼び出されます。 ins.a などは基本的にマジック メソッド a.__getattr__(name)
Python が構築したものと同じように、独自のコンテナを定義できるメソッドがいくつかあります。 -in List、Tuple、Dict など; コンテナは変更可能なコンテナと変更不可能なコンテナに分けられます。
不変コンテナをカスタマイズする場合は、__len__ と __getitem__ のみを定義できます。変数コンテナを定義するには、不変コンテナのすべてのマジック メソッドに加えて、__setitem__ と __delitem__ も定義する必要があります。反復可能です。 __iter__ も定義する必要があります。
次は、List の一般的な機能を備えたコンテナを実装し、リストへのアクセスなどの他の機能を追加する例です。最初の要素、最後の要素、各要素がアクセスされた回数などを記録します。
class SpecialList(object): def __init__(self, values=None): self._index = 0 if values is None: self.values = [] else: self.values = values self.count = {}.fromkeys(range(len(self.values)), 0) def __len__(self):# 通过len(obj)访问容器长度 return len(self.values) def __getitem__(self, key):# 通过obj[key]访问容器内的对象 self.count[key] += 1 return self.values[key] def __setitem__(self, key, value):# 通过obj[key]=value去修改容器内的对象 self.values[key] = value def __iter__(self):# 通过for 循环来遍历容器 return iter(self.values) def __next__(self): # 迭代的具体细节 # 如果__iter__返回时self 则必须实现此方法 if self._index >= len(self.values): raise StopIteration() value = self.values[self._index] self._index += 1 return value def append(self, value): self.values.append(value) def head(self): # 获取第一个元素 return self.values[0] def last(self): # 获取最后一个元素 return self.values[-1]
このメソッドの使用シナリオは、主にニーズを満たすコンテナ クラスのデータ構造を定義する必要がある場合に使用されます。たとえば、ツリーなどのデータ構造をカスタマイズしてみることができます。構造とリンク リスト (すべてコレクションで利用可能)、またはプロジェクトでカスタマイズする必要がある一部のコンテナ タイプ。
マジック メソッドを使用すると、Python コードのコードが簡素化され、コードの可読性が向上します。一般的な Python サードパーティ ライブラリには、マジック メソッドの多くのアプリケーションが含まれています。したがって、今回の記事は単なる紹介にすぎず、実際に使用するには、オープンソースの優れたソースコードと自身のエンジニアリング実践に対する継続的な理解と適切な適用が必要です。
以上がPython の一般的なマジック メソッドについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。