ホームページ  >  記事  >  バックエンド開発  >  Python の一般的なマジック メソッドについて話しましょう

Python の一般的なマジック メソッドについて話しましょう

王林
王林転載
2023-05-15 22:34:04922ブラウズ

魔法のメソッドとは何ですか?

マジック メソッドは 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__ メソッドが自動的に呼び出されます。ご覧のとおり、マジック メソッドはクラスまたはオブジェクトの特定のイベントがトリガーされた後に自動的に実行されますが、独自のプログラムに合わせて特別な機能を備えたクラスをカスタマイズしたい場合は、これらのメソッドを書き直す必要があります。マジック メソッドを使用すると、特別な関数をクラスに簡単に追加できます。

一般的に使用されるマジック メソッド

1. 構築と初期化

__new__、__init__ これら 2 つのマジック メソッドは、クラスを初期化するためによく使用されます。上記で a1 = A("hello") を作成したとき、最初に呼び出したのは __new__ でした。クラスの初期化は 2 つのステップに分かれています:

  • a. クラスの新しいメソッドを呼び出して戻りますクラスのインスタンス オブジェクト
  • b. このクラスの init メソッドを呼び出してインスタンス オブジェクトを初期化します

__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 つであることがわかります。同じだ。

2. 属性アクセスの制御: このタイプのマジック

メソッドは主に、オブジェクトのプロパティにアクセス、定義、変更するときに機能します。主なものは次のとおりです。

  • __getattr__(self, name): ユーザーが属性を取得しようとしたときの動作を定義します。
  • __getattribute__(self, name): このクラスの属性がアクセスされたときの動作を定義します (最初にこのメソッドを呼び出して属性が存在するかどうかを確認し、存在しない場合は getattr を呼び出します)。
  • __setattr__(self, name, value): 属性が設定されたときの動作を定義します。

マジック メソッド self.__setattr__(name,values) は、self.a=a などの属性を初期化するとき、または ins.a=1 などのインスタンス属性を変更するときに、インスタンスが属性にアクセスするときに呼び出されます。 ins.a などは基本的にマジック メソッド a.__getattr__(name)

3. コンテナ クラスの操作

Python が構築したものと同じように、独自のコンテナを定義できるメソッドがいくつかあります。 -in List、Tuple、Dict など; コンテナは変更可能なコンテナと変更不可能なコンテナに分けられます。

不変コンテナをカスタマイズする場合は、__len__ と __getitem__ のみを定義できます。変数コンテナを定義するには、不変コンテナのすべてのマジック メソッドに加えて、__setitem__ と __delitem__ も定義する必要があります。反復可能です。 __iter__ も定義する必要があります。

  • __len__(self): コンテナの長さを返します。
  • __getitem__(self,key): self[key] を実行してコンテナ内のオブジェクトを呼び出す必要がある場合、呼び出しは次のメソッドです __setitem__(self,key,value): self[key] = value を実行する必要がある場合、このメソッドが呼び出されます
  • __iter__(self): コンテナがコンテナ内の x に対して実行できる場合:、または iter(container) を使用する場合は、このメソッドを定義する必要があります。

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

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