Quá tải toán tử Python
Các nhà khai thác Python làm việc cho các lớp học tích hợp. Nhưng cùng một toán tử hành xử khác nhau với các loại khác nhau. Ví dụ, toán tử
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'2 sẽ thực hiện bổ sung số học trên hai số, hợp nhất hai danh sách hoặc nối hai chuỗi.
Tính năng này trong Python cho phép cùng một toán tử có ý nghĩa khác nhau theo ngữ cảnh được gọi là quá tải toán tử.
Vậy điều gì xảy ra khi chúng ta sử dụng chúng với các đối tượng của lớp do người dùng xác định? Chúng ta hãy xem xét lớp sau, cố gắng mô phỏng một điểm trong hệ tọa độ 2 chiều.
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
p1 = Point[1, 2]
p2 = Point[2, 3]
print[p1+p2]
Đầu ra
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'
Ở đây, chúng ta có thể thấy rằng một
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'3 đã được nâng lên, vì Python không biết làm thế nào để thêm hai đối tượng
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 lại với nhau.
Tuy nhiên, chúng ta có thể đạt được nhiệm vụ này trong Python thông qua quá tải người vận hành. Nhưng trước tiên, chúng ta hãy nhận được một khái niệm về các chức năng đặc biệt.
Chức năng đặc biệt của Python
Các chức năng của lớp bắt đầu với Double UnderCore
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'5 được gọi là các chức năng đặc biệt trong Python.
Các chức năng này không phải là các chức năng điển hình mà chúng tôi xác định cho một lớp. Hàm
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'6 mà chúng tôi xác định ở trên là một trong số đó. Nó được gọi là mỗi khi chúng ta tạo một đối tượng mới của lớp đó.
Có rất nhiều chức năng đặc biệt khác trong Python. Ghé thăm các chức năng đặc biệt của Python để tìm hiểu thêm về chúng.
Sử dụng các chức năng đặc biệt, chúng tôi có thể làm cho lớp của chúng tôi tương thích với các chức năng tích hợp.
>>> p1 = Point[2,3]
>>> print[p1]
Giả sử chúng ta muốn hàm
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7 in tọa độ của đối tượng
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 thay vì những gì chúng ta có. Chúng ta có thể xác định một phương thức
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'9 trong lớp của chúng ta kiểm soát cách đối tượng được in. Hãy xem làm thế nào chúng ta có thể đạt được điều này:
class Point:
def __init__[self, x = 0, y = 0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0},{1}]".format[self.x,self.y]
Bây giờ chúng ta hãy thử lại chức năng
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7.
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0}, {1}]".format[self.x, self.y]
p1 = Point[2, 3]
print[p1]
Đầu ra
[2, 3]
Ở đây, chúng ta có thể thấy rằng một
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'3 đã được nâng lên, vì Python không biết làm thế nào để thêm hai đối tượng
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 lại với nhau.
>>> str[p1]
'[2,3]'
>>> format[p1]
'[2,3]'
Tuy nhiên, chúng ta có thể đạt được nhiệm vụ này trong Python thông qua quá tải người vận hành. Nhưng trước tiên, chúng ta hãy nhận được một khái niệm về các chức năng đặc biệt.
Chức năng đặc biệt của Python
Các chức năng của lớp bắt đầu với Double UnderCore Traceback [most recent call last]:
File "", line 9, in
print[p1+p2]
TypeError: unsupported operand type[s] for +: 'Point' and 'Point'
5 được gọi là các chức năng đặc biệt trong Python.
Các chức năng này không phải là các chức năng điển hình mà chúng tôi xác định cho một lớp. Hàm
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'6 mà chúng tôi xác định ở trên là một trong số đó. Nó được gọi là mỗi khi chúng ta tạo một đối tượng mới của lớp đó.
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0},{1}]".format[self.x, self.y]
def __add__[self, other]:
x = self.x + other.x
y = self.y + other.y
return Point[x, y]
Có rất nhiều chức năng đặc biệt khác trong Python. Ghé thăm các chức năng đặc biệt của Python để tìm hiểu thêm về chúng.
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0},{1}]".format[self.x, self.y]
def __add__[self, other]:
x = self.x + other.x
y = self.y + other.y
return Point[x, y]
p1 = Point[1, 2]
p2 = Point[2, 3]
print[p1+p2]
Đầu ra
[3,5]
Ở đây, chúng ta có thể thấy rằng một
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'3 đã được nâng lên, vì Python không biết làm thế nào để thêm hai đối tượng
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 lại với nhau.
Tuy nhiên, chúng ta có thể đạt được nhiệm vụ này trong Python thông qua quá tải người vận hành. Nhưng trước tiên, chúng ta hãy nhận được một khái niệm về các chức năng đặc biệt.
Có rất nhiều chức năng đặc biệt khác trong Python. Ghé thăm các chức năng đặc biệt của Python để tìm hiểu thêm về chúng. | Sử dụng các chức năng đặc biệt, chúng tôi có thể làm cho lớp của chúng tôi tương thích với các chức năng tích hợp. | Giả sử chúng ta muốn hàm Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7 in tọa độ của đối tượng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 thay vì những gì chúng ta có. Chúng ta có thể xác định một phương thức Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'9 trong lớp của chúng ta kiểm soát cách đối tượng được in. Hãy xem làm thế nào chúng ta có thể đạt được điều này: |
| Bây giờ chúng ta hãy thử lại chức năng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7. | Cái đó tốt hơn. Hóa ra, phương pháp tương tự này được gọi khi chúng ta sử dụng hàm tích hợp 1 hoặc 2. |
Vì vậy, khi bạn sử dụng 3 hoặc 4, Python gọi nội bộ là phương thức 5. Do đó tên, các chức năng đặc biệt. | Bây giờ chúng ta hãy quay lại quá tải nhà điều hành. | Quá tải người vận hành + |
Để quá tải toán tử Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'2, chúng tôi sẽ cần thực hiện chức năng 7 trong lớp. Với sức mạnh lớn đến trách nhiệm lớn. Chúng ta có thể làm bất cứ điều gì chúng ta thích, bên trong chức năng này. Nhưng việc trả về một đối tượng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 của tổng tọa độ là hợp lý hơn. | Bây giờ chúng ta hãy thử lại thao tác bổ sung: | Điều thực sự xảy ra là, khi bạn sử dụng 9, Python gọi 0 đến lượt nó là 1. Sau này, hoạt động bổ sung được thực hiện theo cách chúng tôi chỉ định. |
Tương tự, chúng ta cũng có thể quá tải các toán tử khác. Chức năng đặc biệt mà chúng ta cần thực hiện được lập bảng dưới đây. | Nhà điều hành | Biểu hiện |
Trong nội bộ | Phép cộng | 9 |
0 | Phép trừ | 4 |
5 | Phép nhân | 6 |
7 | Quyền lực | 8 |
9 | Phân công | 0 |
1 | Phân chia sàn | 2 |
3 | Phần còn lại [modulo] | 4 |
5 | Bitwise trái thay đổi | 6 |
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0}, {1}]".format[self.x, self.y]
p1 = Point[2, 3]
print[p1]
7
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0}, {1}]".format[self.x, self.y]
p1 = Point[2, 3]
print[p1]
BitWise phải thay đổi
class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0}, {1}]".format[self.x, self.y]
p1 = Point[2, 3]
print[p1]
8class Point:
def __init__[self, x=0, y=0]:
self.x = x
self.y = y
def __str__[self]:
return "[{0}, {1}]".format[self.x, self.y]
p1 = Point[2, 3]
print[p1]
9Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'0
Đầu ra
Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'1
Bitwise và
Có rất nhiều chức năng đặc biệt khác trong Python. Ghé thăm các chức năng đặc biệt của Python để tìm hiểu thêm về chúng. | Sử dụng các chức năng đặc biệt, chúng tôi có thể làm cho lớp của chúng tôi tương thích với các chức năng tích hợp. | Giả sử chúng ta muốn hàm Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7 in tọa độ của đối tượng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 thay vì những gì chúng ta có. Chúng ta có thể xác định một phương thức Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'9 trong lớp của chúng ta kiểm soát cách đối tượng được in. Hãy xem làm thế nào chúng ta có thể đạt được điều này: |
| Bây giờ chúng ta hãy thử lại chức năng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'7. | Cái đó tốt hơn. Hóa ra, phương pháp tương tự này được gọi khi chúng ta sử dụng hàm tích hợp 1 hoặc 2. |
Vì vậy, khi bạn sử dụng 3 hoặc 4, Python gọi nội bộ là phương thức 5. Do đó tên, các chức năng đặc biệt. | Bây giờ chúng ta hãy quay lại quá tải nhà điều hành. | Quá tải người vận hành + |
Để quá tải toán tử Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'2, chúng tôi sẽ cần thực hiện chức năng 7 trong lớp. Với sức mạnh lớn đến trách nhiệm lớn. Chúng ta có thể làm bất cứ điều gì chúng ta thích, bên trong chức năng này. Nhưng việc trả về một đối tượng Traceback [most recent call last]: File "", line 9, in print[p1+p2] TypeError: unsupported operand type[s] for +: 'Point' and 'Point'4 của tổng tọa độ là hợp lý hơn. | Bây giờ chúng ta hãy thử lại thao tác bổ sung: | Điều thực sự xảy ra là, khi bạn sử dụng 9, Python gọi 0 đến lượt nó là 1. Sau này, hoạt động bổ sung được thực hiện theo cách chúng tôi chỉ định. |
Tương tự, chúng ta cũng có thể quá tải các toán tử khác. Chức năng đặc biệt mà chúng ta cần thực hiện được lập bảng dưới đây. | Nhà điều hành | Biểu hiện |
Trong nội bộ | Phép cộng | 9 |