ホームページ  >  記事  >  バックエンド開発  >  Python の魔法のメソッドを学ぶ: 簡単な説明

Python の魔法のメソッドを学ぶ: 簡単な説明

PHPz
PHPzオリジナル
2024-08-09 06:44:42745ブラウズ

Learn Python Magic Methods: A Simple Explanation

Python のマジック メソッドを理解する

Python の

マジック メソッド (名前の先頭と末尾に二重アンダースコアがあるため) dunder メソッドとも呼ばれ、さまざまな操作に対するオブジェクトの動作を定義できます。これらはカスタム動作を可能にし、クラスを組み込み型のように動作させることができます。このブログでは、さまざまなカテゴリの魔法の方法を検討し、詳細な説明を提供し、実践的な例と使用例を示します。

1. 属性アクセスメソッド

これらのマジック メソッドは、オブジェクトの属性へのアクセス、変更、削除の方法を制御します。

__getattr__ と __getattribute__

  • __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__

  • __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

実際の使用例: 属性の設定または削除時に検証ルールまたは制限を適用します。

2. コンテナメソッド

これらのマジック メソッドを使用すると、オブジェクトをコンテナ (リスト、辞書など) のように動作させることができます。

__len__、__getitem__、__setitem__、__delitem__、および __iter__

  • __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

実用的な使用例: 標準のリスト操作をサポートしながら、特殊な動作や追加のメソッドを必要とするカスタム コレクション クラスを作成します。

3. 数値メソッドと比較メソッド

これらのメソッドは、クラスのオブジェクトが数値演算や比較とどのように対話するかを定義します。

数値メソッド

  • __add__、__sub__、__mul__、__truediv__、__floordiv__、__mod__、__pow__: 算術演算を定義します。

例: カスタム複素数クラス

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)

実用的な使用例: 複素数、ベクトル、行列などのカスタム数値型を実装します。

比較方法

  • __eq__、__ne__、__lt__、__le__、__gt__、__ge__: 比較演算を定義します。

例: カスタム クラスの合計順序付けの実装

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]

実用的な使用例: カスタム オブジェクトの並べ替えや比較を可能にし、ヒープ、二分探索ツリーなどのデータ構造で、または単にカスタム オブジェクトのリストを並べ替える場合に役立ちます。

4. コンテナメソッド: 実用的な使用例

大文字と小文字を区別しないキーを使用したカスタム辞書

キーを大文字と小文字を区別せずに扱う辞書のようなオブジェクトを作成します。

例: 大文字と小文字を区別しない辞書

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。