Kaedah Ajaib dalam Python

Kaedah Ajaib dalam Python

Artikel ini menerangkan tentang kaedah ajaib dalam Python.

YouTube Video

Kaedah Ajaib dalam Python

Kaedah ajaib (kaedah khas) dalam Python ialah kaedah yang dinamakan khusus untuk memberikan kelas tingkah laku yang unik. Sebagai contoh, ia dicirikan dengan menggunakan dua garis bawah (dunders), seperti __init__ dan __str__. Oleh itu, ia juga dipanggil sebagai kaedah dunder.

Dengan mentakrifkan kaedah ajaib, anda boleh menyesuaikan tingkah laku piawai kelas. Sebagai contoh, mentakrifkan __add__ membolehkan anda mengubah tingkah laku operator +.

Kaedah Ajaib untuk Permulaan dan Perwakilan Rentetan

__init__: Kaedah Permulaan

Kaedah __init__ ialah konstruktor yang dipanggil secara automatik ketika sesuatu instans dicipta.

1class Person:
2    def __init__(self, name, age):
3        self.name = name
4        self.age = age
5
6person = Person("Alice", 30)
7print(person.name)  # Alice

__str__: Perwakilan Rentetan yang Mudah Dibaca Manusia

Kaedah __str__ memulangkan perwakilan rentetan yang mudah dibaca manusia. Ia dipanggil oleh print() dan str().

1class Person:
2    def __init__(self, name):
3        self.name = name
4
5    def __str__(self):
6        return f"Person: {self.name}"
7
8person = Person("Bob")
9print(person)  # Person: Bob

__repr__: Perwakilan Rentetan untuk Tujuan Penyahpepijatan

Kaedah __repr__ memulangkan perwakilan rentetan untuk tujuan penyahpepijatan. Ia digunakan oleh repr() dan semasa dipaparkan dalam pentafsir.

1class Person:
2    def __init__(self, name):
3        self.name = name
4
5    def __repr__(self):
6        return f"Person(name={self.name!r})"
7
8person = Person("Eve")
9print(repr(person))  # Person(name='Eve')

Melakukan Overloading ke atas Operator Aritmetik

__add__: Operator +

Dengan menggunakan kaedah ajaib, operator aritmetik boleh dioverload. Sebagai contoh, kaedah __add__ membolehkan overloading operator +.

 1class Vector:
 2    def __init__(self, x, y):
 3        self.x = x
 4        self.y = y
 5
 6    def __add__(self, other):
 7        return Vector(self.x + other.x, self.y + other.y)
 8
 9    def __repr__(self):
10        return f"Vector({self.x}, {self.y})"
11
12    # Other arithmetic magic methods:
13    # def __sub__(self, other):       # Subtraction (-)
14    # def __mul__(self, other):       # Multiplication (*)
15    # def __truediv__(self, other):   # True division (/)
16    # def __floordiv__(self, other):  # Floor division (//)
17    # def __mod__(self, other):       # Modulo (%)
18    # def __pow__(self, other):       # Exponentiation (**)
19
20v1 = Vector(1, 2)
21v2 = Vector(3, 4)
22print(v1 + v2)  # Vector(4, 6)

Kaedah ajaib aritmetik lain termasuklah:.

Kaedah Operator
__add__ +
__sub__ -
__mul__ *
__truediv__ /
__floordiv__ //
__mod__ %
__pow__ **

Menyesuaikan Operator Perbandingan

Anda juga boleh melakukan overloading ke atas operator perbandingan. Sebagai contoh, kaedah __eq__ melakukan overloading pada operator kesamaan.

 1class Box:
 2    def __init__(self, volume):
 3        self.volume = volume
 4
 5    def __eq__(self, other):
 6        return self.volume == other.volume
 7
 8    def __lt__(self, other):
 9        return self.volume < other.volume
10
11    # Comparison magic methods:
12    # def __eq__(self, other):  # Equal to (==)
13    # def __ne__(self, other):  # Not equal to (!=)
14    # def __lt__(self, other):  # Less than (<)
15    # def __le__(self, other):  # Less than or equal to (<=)
16    # def __gt__(self, other):  # Greater than (>)
17    # def __ge__(self, other):  # Greater than or equal to (>=)
18
19b1 = Box(100)
20b2 = Box(200)
21
22print(b1 == b2)  # False
23print(b1 < b2)   # True

Terdapat juga kaedah ajaib berikut:. Kaedah ajaib ini menentukan perbandingan seperti kesamaan dan susunan antara objek.

Operator Kaedah Ajaib
== __eq__
!= __ne__
< __lt__
<= __le__
> __gt__
>= __ge__

Kaedah Ajaib untuk Jenis Kontena

Anda boleh mencipta kelas yang berkelakuan seperti senarai atau kamus.

__len__: Mendapatkan Bilangan Elemen

Kaedah __len__ ialah kaedah ajaib yang memulangkan bilangan elemen.

1class Basket:
2    def __init__(self, items):
3        self.items = items
4
5    def __len__(self):
6        return len(self.items)
7
8basket = Basket(["apple", "banana"])
9print(len(basket))  # 2

__getitem__: Akses Indeks

Kaedah __getitem__ dipanggil apabila menggunakan akses indeks.

1class Basket:
2    def __init__(self, items):
3        self.items = items
4
5    def __getitem__(self, index):
6        return self.items[index]
7
8basket = Basket(["apple", "banana"])
9print(basket[1])  # banana

__setitem__ dan __delitem__: Menulis dan Memadam

Kaedah __setitem__ dan __delitem__ dipanggil ketika menulis atau memadam item.

 1class Basket:
 2    def __init__(self, items):
 3        self.items = items
 4
 5    def __setitem__(self, index, value):
 6        self.items[index] = value
 7
 8    def __delitem__(self, index):
 9        del self.items[index]
10
11basket = Basket(["apple", "banana"])
12basket[1] = "grape"
13del basket[0]
14print(basket.items)  # ['grape']

Kaedah Ajaib untuk Pengulangan

Untuk membolehkan sesuatu objek diulang (iterable) dalam gelung for, laksanakan yang berikut:.

__iter__ dan __next__

 1class Counter:
 2    def __init__(self, limit):
 3        self.limit = limit
 4        self.current = 0
 5
 6    def __iter__(self):
 7        return self
 8
 9    def __next__(self):
10        if self.current >= self.limit:
11            raise StopIteration
12        self.current += 1
13        return self.current
14
15for num in Counter(3):
16    print(num)
17# Output:
18# 1
19# 2
20# 3

Pengurus Konteks (Penyataan with)

Dengan mentakrifkan kaedah __enter__ dan __exit__, anda boleh melaksanakan pra- dan pasca-pemprosesan untuk penyataan with.

 1class FileOpener:
 2    def __init__(self, filename):
 3        self.filename = filename
 4
 5    def __enter__(self):
 6        self.file = open(self.filename, 'r')
 7        return self.file
 8
 9    def __exit__(self, exc_type, exc_val, exc_tb):
10        self.file.close()
11
12with FileOpener("example.txt") as f:
13    content = f.read()
14    print(content)

Objek yang Boleh Dipanggil: __call__

Dengan mentakrifkan kaedah __call__, anda boleh menjadikan satu instans boleh dipanggil seperti fungsi.

1class Greeter:
2    def __init__(self, greeting):
3        self.greeting = greeting
4
5    def __call__(self, name):
6        return f"{self.greeting}, {name}!"
7
8hello = Greeter("Hello")
9print(hello("Alice"))  # Hello, Alice!

Ringkasan

Kaedah ajaib dalam Python ialah cara yang berkuasa untuk menambah tingkah laku yang semula jadi dan intuitif kepada kelas. Setiap kaedah mempunyai tujuan yang jelas, dan melaksanakannya dengan betul membolehkan anda menulis kod yang lebih fleksibel dan Pythonik.

Kaedah ajaib berfungsi sebagai 'antara muka yang tidak kelihatan' yang menyokong cara objek Python berinteraksi dan berkelakuan di belakang tabir.

Anda boleh mengikuti artikel di atas menggunakan Visual Studio Code di saluran YouTube kami. Sila lihat juga saluran YouTube kami.

YouTube Video