Các phương thức ma thuật trong Python

Các phương thức ma thuật trong Python

Bài viết này giải thích về các phương thức ma thuật trong Python.

YouTube Video

Các phương thức ma thuật trong Python

Các phương thức ma thuật (phương thức đặc biệt) trong Python là những phương thức được đặt tên đặc biệt để cung cấp cho lớp những hành vi riêng biệt. Ví dụ, chúng được nhận biết qua việc được đặt trong hai dấu gạch dưới (dunder), như __init____str__. Vì vậy, chúng cũng được gọi là phương thức dunder.

Bằng cách định nghĩa các phương thức ma thuật, bạn có thể tùy chỉnh hành vi mặc định của lớp. Ví dụ, định nghĩa __add__ cho phép bạn thay đổi hành vi của toán tử +.

Các phương thức ma thuật cho khởi tạo và biểu diễn chuỗi

__init__: Phương thức khởi tạo

Phương thức __init__ là một hàm khởi tạo được gọi tự động khi một đối tượng được tạo ra.

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__: Biểu diễn chuỗi dễ đọc cho con người

Phương thức __str__ trả về một chuỗi biểu diễn dễ đọc cho con người. Nó được gọi bởi print()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__: Biểu diễn chuỗi dùng cho mục đích debug

Phương thức __repr__ trả về một chuỗi biểu diễn cho mục đích gỡ lỗi. Nó được sử dụng bởi repr() và khi hiển thị trong trình thông dịch.

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')

Nạp chồng các toán tử số học

__add__: Toán tử +

Bằng cách sử dụng phương thức ma thuật, các toán tử số học có thể được nạp chồng. Ví dụ, phương thức __add__ cho phép nạp chồng toán tử +.

 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)

Các phương thức ma thuật số học khác bao gồm:.

Phương thức Toán tử
__add__ +
__sub__ -
__mul__ *
__truediv__ /
__floordiv__ //
__mod__ %
__pow__ **

Tùy chỉnh các toán tử so sánh

Bạn cũng có thể nạp chồng các toán tử so sánh. Ví dụ, phương thức __eq__ nạp chồng toán tử so sánh bằng.

 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

Cũng có các phương thức ma thuật sau:. Các phương thức ma thuật này định nghĩa so sánh như bằng nhau và sắp xếp giữa các đối tượng.

Toán tử Phương thức ma thuật
== __eq__
!= __ne__
< __lt__
<= __le__
> __gt__
>= __ge__

Các phương thức ma thuật cho kiểu dữ liệu chứa

Bạn có thể tạo các lớp hoạt động như danh sách hoặc từ điển.

__len__: Lấy số lượng phần tử

Phương thức __len__ là một phương thức ma thuật trả về số lượng phần tử.

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__: Truy cập theo chỉ mục

Phương thức __getitem__ được gọi khi truy cập bằng chỉ mục.

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____delitem__: Ghi và xóa

Các phương thức __setitem____delitem__ được gọi khi ghi hoặc xóa phần tử.

 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']

Các phương thức ma thuật cho việc lặp

Để một đối tượng có thể lặp được trong vòng lặp for, hãy cài đặt các phương thức sau:.

__iter____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

Quản lý ngữ cảnh (câu lệnh with)

Bằng cách định nghĩa các phương thức __enter____exit__, bạn có thể thực hiện xử lý trước và sau khi sử dụng câu lệnh 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)

Đối tượng có thể gọi: __call__

Bằng cách định nghĩa phương thức __call__, bạn có thể làm cho một đối tượng có thể gọi như một hàm.

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!

Tóm tắt

Các phương thức ma thuật trong Python là một cách mạnh mẽ để thêm hành vi tự nhiên và trực quan cho các lớp. Mỗi phương thức đều có mục đích rõ ràng, và việc triển khai chúng đúng sẽ giúp bạn viết mã linh hoạt và chuẩn Python hơn.

Các phương thức ma thuật đóng vai trò như một 'giao diện vô hình' hỗ trợ cách các đối tượng Python tương tác và thể hiện hành vi phía sau hậu trường.

Bạn có thể làm theo bài viết trên bằng cách sử dụng Visual Studio Code trên kênh YouTube của chúng tôi. Vui lòng ghé thăm kênh YouTube.

YouTube Video