Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Belajar Kaedah Sihir Python: Penjelasan Mudah

Belajar Kaedah Sihir Python: Penjelasan Mudah

PHPz
PHPzasal
2024-08-09 06:44:42751semak imbas

Learn Python Magic Methods: A Simple Explanation

Memahami Kaedah Sihir dalam Python

Kaedah ajaib dalam Python, juga dikenali sebagai kaedah dunder (kerana ia mempunyai garis bawah berganda pada permulaan dan penghujung nama mereka), membolehkan kami mentakrifkan gelagat objek kami untuk pelbagai operasi. Mereka mendayakan gelagat tersuai dan boleh menjadikan kelas kami bertindak seperti jenis terbina dalam. Dalam blog ini, kami akan meneroka pelbagai kategori kaedah sihir, memberikan penjelasan terperinci dan memberikan contoh praktikal serta kes penggunaan.

1. Kaedah Akses Atribut

Kaedah ajaib ini mengawal cara atribut objek anda diakses, diubah suai atau dipadamkan.

__getattr__ dan __getattribute__

  • __getattr__: Dipanggil apabila atribut tidak ditemui dalam objek.

  • __getattribute__: Dipanggil tanpa syarat untuk mengakses sebarang atribut.

Contoh: Akses Atribut Tersuai dengan Pengelogan

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

Kes Penggunaan Praktikal: Mengelog akses atribut dalam senario nyahpepijat untuk mengesan bila dan cara atribut diakses atau diubah suai.

__setattr__ dan __delattr__

  • __setattr__: Dipanggil apabila tugasan atribut dicuba.

  • __delattr__: Dipanggil apabila pemadaman atribut cuba dilakukan.

Contoh: Pengubahsuaian Atribut Tersuai dengan Pengesahan

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

Kes Penggunaan Praktikal: Menguatkuasakan peraturan atau sekatan pengesahan apabila menetapkan atau memadamkan atribut.

2. Kaedah Bekas

Kaedah ajaib ini membolehkan objek anda berkelakuan seperti bekas (senarai, kamus, dll.).

__len__, __getitem__, __setitem__, __delitem__ dan __iter__

  • __len__: Mengembalikan panjang bekas.

  • __getitem__: Mendapatkan semula item pada indeks atau kunci tertentu.

  • __setitem__: Menetapkan item pada indeks atau kunci tertentu.

  • __delitem__: Memadamkan item pada indeks atau kunci tertentu.

  • __iter__: Mengembalikan objek lelaran.

Contoh: Objek seperti Senarai Tersuai

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

Kes Penggunaan Praktikal: Mencipta kelas koleksi tersuai yang memerlukan tingkah laku khusus atau kaedah tambahan sambil masih menyokong operasi senarai standard.

3. Kaedah Numerik dan Perbandingan

Kaedah ini mentakrifkan cara objek kelas anda berinteraksi dengan operasi berangka dan perbandingan.

Kaedah Numerik

  • __add__, __sub__, __mul__, __truediv__, __floordiv__, __mod__, __pow__: Takrifkan operasi aritmetik.

Contoh: Kelas Nombor Kompleks Tersuai

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)

Kes Penggunaan Praktikal: Melaksanakan jenis angka tersuai seperti nombor kompleks, vektor atau matriks.

Kaedah Perbandingan

  • __eq__, __ne__, __lt__, __le__, __gt__, __ge__: Tentukan operasi perbandingan.

Contoh: Melaksanakan Jumlah Pesanan untuk Kelas Tersuai

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]

Kes Penggunaan Praktikal: Mendayakan objek tersuai diisih atau dibandingkan, berguna dalam struktur data seperti timbunan, pepohon carian binari atau hanya semasa mengisih senarai objek tersuai.

4. Kaedah Bekas: Kes Penggunaan Praktikal

Kamus Tersuai dengan Kekunci Tidak Peka Huruf Besar

Mencipta objek seperti kamus yang menganggap kekunci sebagai tidak sensitif huruf besar.

Contoh: Kamus Case-Insensitive

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

Kes Penggunaan Praktikal: Mencipta kamus yang mana kunci harus dianggap sebagai tidak sensitif huruf besar, berguna untuk mengendalikan input pengguna, tetapan konfigurasi, dsb.

Kesimpulan

Kaedah ajaib menyediakan cara yang berkuasa untuk menyesuaikan tingkah laku objek anda dalam Python. Memahami dan menggunakan kaedah ini dengan berkesan boleh menjadikan kelas anda lebih intuitif dan disepadukan dengan lancar dengan fungsi dan pengendali terbina dalam Python. Sama ada anda melaksanakan jenis berangka tersuai, bekas atau corak akses atribut, kaedah ajaib boleh meningkatkan kefleksibelan dan kefungsian kod anda dengan ketara

Atas ialah kandungan terperinci Belajar Kaedah Sihir Python: Penjelasan Mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn