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__
và __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()
và 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__
và __delitem__
: Ghi và xóa
Các phương thức __setitem__
và __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__
và __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__
và __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.