Nạp chồng toán tử trong Python
Nạp chồng toán tử Python là gì?
Khái niệm về nạp chồng toán tử Python
Nạp chồng toán tử là quá trình sử dụng toán tử theo những cách khác nhau tùy thuộc vào toán hạng. Bạn có thể thay đổi cách một toán tử trong Python hoạt động trên các kiểu dữ liệu khác nhau.
Một ví dụ rất phổ biến và tiện lợi là toán tử Addition (+). Chỉ cần nghĩ cách để toán tử '+' hoạt động trên hai số và cùng một toán tử hoạt động trên hai chuỗi. Nó sẽ thực hiện "Phép cộng" trên các số trong khi thực hiện "Kết hợp" trên chuỗi.
Các toán tử trong Python hoạt động cho các lớp dựng sẵn, như int, str, list,... Nhưng bạn có thể mở rộng khả năng hoạt động của chúng để chúng cũng hoạt động trên các đối tượng của các lớp do người dùng xác định.
>>> Xem thêm: Đa kế thừa trong Python - Tìm hiểu về đa kế thừa trong lập trình Python
Ví dụ về nạp chồng toán tử Python
class bubble:
def __init__(self, volume):
self.volume = volume
Ở ví dụ trên, chúng ta đã xác định lớp class bubble có khối lượng thuộc tính, khi kết hợp hai class trên, chúng ta sẽ nhận được giá trị của tổng hai lớp.
>>> b1 = bubble(20)
>>> b2 = bubble(30)
Khi kết hợp b1 với b2 ta sẽ nhận được kết quả thế nào, cùng xem:
Output:
TypeError: unsupported operand type(s) for +: ‘bubble’ and ‘bubble’
Ở ví dụ này, bạn sẽ thấy lỗi xảy ra khi kết hợp hai lớp. Lý do xảy ra lỗi này là do bạn chưa mở rộng khả năng hoạt động của phép tính, mà phép tính này chỉ hoạt động trên các lớp được tích hợp sẵn. Để làm các toán tử này hoạt động trên các lớp class bubble, bạn sẽ cần sử dụng các phương thức “ma thuật.
>>> Xem thêm: Khóa học Lập trình Python
Các hàm ma thuật trong Python
Khái niệm
Để thực hiện nạp chồng toán tử, Python cung cấp một số hàm đặc biệt hoặc hàm ma thuật được tự động gọi khi nó được liên kết với toán tử cụ thể đó. Các phương thức ma thuật trong Python là các phương thức đặc biệt. Chúng bắt đầu và kết thúc bằng dấu gạch dưới kép (__). __Init __ () là một trong những phương thức như vậy. Một phương thức ma thuật khác mà chúng ta sử dụng là phương thức __str __ (). Phương thức __str __ () cho phép bạn kiểm soát cách một đối tượng trong lớp được in. Vì vậy, nếu bạn thêm phương thức này vào class bubble của mình và in một đối tượng của lớp, nó sẽ hoạt động như sau:
class bubble:
def __init__(self, volume):
self.volume = volume
def __str__(self):
return "volume is " + str(self.volume)
Sau đó thực hiện điều này trong terminal:
>>> b1 = bubble(20)
>>> print(b1)
Output:
volume is 20
>>>
Phân tích chi tiết về hàm ma thuật
Khi chúng ta sử dụng một toán tử trên các kiểu dữ liệu do người dùng xác định thì tự động một hàm đặc biệt hoặc hàm ma thuật liên quan đến toán tử đó được gọi. Thay đổi hành vi của toán tử cũng đơn giản như thay đổi hành vi của phương thức hoặc hàm. Bạn xác định các phương thức trong lớp của mình và các toán tử hoạt động theo hành vi đó được xác định trong các phương thức. Khi chúng ta sử dụng toán tử +, phương thức ma thuật __add__ sẽ tự động được gọi trong đó phép toán cho toán tử + được xác định. Ở đó bằng cách thay đổi mã của phương thức ma thuật này, chúng ta có thể cung cấp thêm ý nghĩa cho toán tử +.
Ví dụ
# Python Program illustrate how # to overload an binary + operator class A: def __init__(self, a): self.a = a # adding two objects def __add__(self, o): return self.a + o.a ob1 = A(1) ob2 = A(2) ob3 = A("Geeks") ob4 = A("For") print(ob1 + ob2) print(ob3 + ob4) |
Các hàm ma thuật để nạp chồng trong Python
OPERATOR |
EXPRESSION |
MAGIC METHOD |
Addition |
b1 + b2 |
__add__() |
Subtraction |
b1 – b2 |
__sub__() |
Multiplication |
b1 * b2 |
__mul__() |
Division |
b1 / b2 |
__truediv__() |
Power |
b1 ** b2 |
__pow__() |
Floor division |
b1 // b2 |
__floordiv__() |
Modulo operator |
b1 % b2 |
__mod__() |
Bitwise left shift |
b1 << b2 |
__lshift__() |
Bitwise right shift |
b1 >> b2 |
__rshift__() |
Bitwise NOT |
~b1 |
__invert__() |
Bitwise AND |
b1 & b2 |
__and__() |
Bitwise OR |
b1 | b2 |
__or__() |
Bitwise XOR |
b1 ^ b2 |
__xor__() |
Less than |
b1 < b2 |
__lt__() |
Less than equal to |
b1 <= b2 |
__le__() |
Greater than |
b1 > b2 |
__gt__() |
Greater than equal to |
b1 >= b2 |
__ge__() |
Equal to |
b1 == b2 |
__eq__() |
Not equal to |
b1 != b2 |
__ne__() |
Kết luận: Trong bài viết này, bạn đã học cách sử dụng một hàm đặc biệt đi kèm với tính đa hình trong Python. Bên cạnh đó, bạn cũng đã tìm hiểu nạp chồng toán tử trong Python là gì và mở rộng khả năng hoạt động của một toán tử để nó có thể hoạt động trên các lớp do người dùng định nghĩa. Để tìm hiểu thêm về Python và các ngôn ngữ lập trình khác, tham khóa các khóa học lập trình tại T3H bạn nhé!
Nguồn tham khảo: techvidvan, geeksforgeeks