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.
Kaedah ajaib ini mengawal cara atribut objek anda diakses, diubah suai atau dipadamkan.
__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__: 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.
Kaedah ajaib ini membolehkan objek anda berkelakuan seperti bekas (senarai, kamus, dll.).
__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.
Kaedah ini mentakrifkan cara objek kelas anda berinteraksi dengan operasi berangka dan perbandingan.
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.
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.
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.
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!