マジック メソッド (名前の先頭と末尾に二重アンダースコアがあるため) dunder メソッドとも呼ばれ、さまざまな操作に対するオブジェクトの動作を定義できます。これらはカスタム動作を可能にし、クラスを組み込み型のように動作させることができます。このブログでは、さまざまなカテゴリの魔法の方法を検討し、詳細な説明を提供し、実践的な例と使用例を示します。
これらのマジック メソッドは、オブジェクトの属性へのアクセス、変更、削除の方法を制御します。
__getattr__: オブジェクト内に属性が見つからない場合に呼び出されます。
__getattribute__: 任意の属性にアクセスするために無条件に呼び出されます。
例: ロギングを使用したカスタム属性アクセス
class LoggedAttributes: def __init__(self, name): self.name = name def __getattr__(self, item): print(f"Accessing non-existent attribute: {item}") return None def __getattribute__(self, item): print(f"Getting attribute: {item}") return super().__getattribute__(item) # Usage obj = LoggedAttributes("Alice") print(obj.name) # Output: Getting attribute: name\nAlice print(obj.age) # Output: Accessing non-existent attribute: age\nNone
実用的な使用例: デバッグ シナリオで属性アクセスをログに記録し、属性がいつ、どのようにアクセスまたは変更されたかを追跡します。
__setattr__: 属性の割り当てが試行されるときに呼び出されます。
__delattr__: 属性の削除が試行されたときに呼び出されます。
例: 検証を伴うカスタム属性の変更
class Person: def __init__(self, name, age): self.name = name self.age = age def __setattr__(self, key, value): if key == "age" and value < 0: raise ValueError("Age cannot be negative") super().__setattr__(key, value) def __delattr__(self, item): if item == "name": raise AttributeError("Can't delete attribute 'name'") super().__delattr__(item) # Usage p = Person("Alice", 30) p.age = 25 # Works fine # p.age = -1 # Raises ValueError # del p.name # Raises AttributeError
実際の使用例: 属性の設定または削除時に検証ルールまたは制限を適用します。
これらのマジック メソッドを使用すると、オブジェクトをコンテナ (リスト、辞書など) のように動作させることができます。
__len__: コンテナの長さを返します。
__getitem__: 指定されたインデックスまたはキーにある項目を取得します。
__setitem__: 指定されたインデックスまたはキーに項目を設定します。
__delitem__: 指定されたインデックスまたはキーにある項目を削除します。
__iter__: イテレータ オブジェクトを返します。
例: カスタムリストのようなオブジェクト
class CustomList: def __init__(self): self._items = [] def __len__(self): return len(self._items) def __getitem__(self, index): return self._items[index] def __setitem__(self, index, value): self._items[index] = value def __delitem__(self, index): del self._items[index] def __iter__(self): return iter(self._items) def append(self, item): self._items.append(item) # Usage cl = CustomList() cl.append(1) cl.append(2) cl.append(3) print(len(cl)) # Output: 3 print(cl[1]) # Output: 2 for item in cl: print(item) # Output: 1 2 3
実用的な使用例: 標準のリスト操作をサポートしながら、特殊な動作や追加のメソッドを必要とするカスタム コレクション クラスを作成します。
これらのメソッドは、クラスのオブジェクトが数値演算や比較とどのように対話するかを定義します。
例: カスタム複素数クラス
class Complex: def __init__(self, real, imag): self.real = real self.imag = imag def __add__(self, other): return Complex(self.real + other.real, self.imag + other.imag) def __sub__(self, other): return Complex(self.real - other.real, self.imag - other.imag) def __repr__(self): return f"({self.real} + {self.imag}i)" # Usage c1 = Complex(1, 2) c2 = Complex(3, 4) print(c1 + c2) # Output: (4 + 6i) print(c1 - c2) # Output: (-2 + -2i)
実用的な使用例: 複素数、ベクトル、行列などのカスタム数値型を実装します。
例: カスタム クラスの合計順序付けの実装
from functools import total_ordering @total_ordering class Book: def __init__(self, title, author): self.title = title self.author = author def __eq__(self, other): return (self.title, self.author) == (other.title, other.author) def __lt__(self, other): return (self.title, self.author) < (other.title, other.author) def __repr__(self): return f"{self.title} by {self.author}" # Usage book1 = Book("Title1", "Author1") book2 = Book("Title2", "Author2") books = [book2, book1] print(sorted(books)) # Output: [Title1 by Author1, Title2 by Author2]
実用的な使用例: カスタム オブジェクトの並べ替えや比較を可能にし、ヒープ、二分探索ツリーなどのデータ構造で、または単にカスタム オブジェクトのリストを並べ替える場合に役立ちます。
キーを大文字と小文字を区別せずに扱う辞書のようなオブジェクトを作成します。
例: 大文字と小文字を区別しない辞書
class CaseInsensitiveDict: def __init__(self): self._data = {} def __getitem__(self, key): return self._data[key.lower()] def __setitem__(self, key, value): self._data[key.lower()] = value def __delitem__(self, key): del self._data[key.lower()] def __contains__(self, key): return key.lower() in self._data def keys(self): return self._data.keys() def items(self): return self._data.items() def values(self): return self._data.values() # Usage cid = CaseInsensitiveDict() cid["Name"] = "Alice" print(cid["name"]) # Output: Alice print("NAME" in cid) # Output: True
実用的な使用例: キーを大文字と小文字を区別せずに扱う必要がある辞書を作成します。これは、ユーザー入力や構成設定などの処理に役立ちます。
マジック メソッドは、Python でオブジェクトの動作をカスタマイズする強力な方法を提供します。これらの方法を理解し、効果的に使用すると、クラスがより直感的になり、Python の組み込み関数や演算子とシームレスに統合できるようになります。カスタムの数値型、コンテナー、または属性アクセス パターンを実装する場合でも、マジック メソッドを使用すると、コードの柔軟性と機能性が大幅に向上します
以上がPython の魔法のメソッドを学ぶ: 簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。