Hướng dẫn operator overloading in python definition - quá tải toán tử trong định nghĩa python

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)
<__main__.Point object at 0x00000000031F8CC0>

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.

Chức năng đặc biệt của PythonCá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.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.
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
1 hoặc
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
2.
Vì vậy, khi bạn sử dụng
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
3 hoặc
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
4, Python gọi nội bộ là phương thức
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
9, Python gọ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)
0 đến lượt nó là
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)
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ànhBiểu hiện
Trong nội bộPhép cộng
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
9
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)
0
Phép trừ
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)
4
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)
5
Phép nhân
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)
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)
7
Quyền lực
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)
8
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)
9
Phân cô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)


p1 = Point(2, 3)
print(p1)
0
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)
1
Phân chia sàn
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)
2
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)
3
Phần còn lại (modulo)
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)
4
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)
5
Bitwise trá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)
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

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

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

Traceback (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à

Chức năng đặc biệt của PythonCá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.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.
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
1 hoặc
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
2.
Vì vậy, khi bạn sử dụng
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
3 hoặc
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
4, Python gọi nội bộ là phương thức
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
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
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
9, Python gọ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)
0 đến lượt nó là
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)
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ànhBiểu hiện
Trong nội bộPhép cộng
>>> p1 = Point(2,3)
>>> print(p1)
<__main__.Point object at 0x00000000031F8CC0>
9

Toán tử quá tải giải thích là gì?

Đa hình: Đa hình (hoặc quá tải toán tử) là một cách trong đó các hệ thống OO cho phép cùng tên hoặc ký hiệu toán tử được sử dụng cho nhiều hoạt động. Nghĩa là, nó cho phép biểu tượng toán tử hoặc tên bị ràng buộc với nhiều hơn một triển khai của toán tử. Một ví dụ đơn giản về điều này là dấu hiệu++.a manner in which OO systems allow the same operator name or symbol to be used for multiple operations. That is, it allows the operator symbol or name to be bound to more than one implementation of the operator. A simple example of this is the “+” sign.

Điều gì đang quá tải trong Python với ví dụ?

Ví dụ: toán tử + 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ử.allows the same operator to have different meaning according to the context is called operator overloading.

Bạn có thể xác định một toán tử trong Python không?

Trong Python, các nhà khai thác là các biểu tượng đặc biệt chỉ định rằng một số loại tính toán nên được thực hiện.Các giá trị mà một toán tử hoạt động được gọi là toán hạng.operators are special symbols that designate that some sort of computation should be performed. The values that an operator acts on are called operands.

Toán tử quá tải và ghi đè trong Python là gì?

Quá tải phương thức cho phép nhiều phương thức trong cùng một lớp có cùng tên nhưng các tham số khác nhau.Ghi đè phương thức cho phép lớp cha và lớp con có các phương thức có cùng tên và cùng một tham số.Phương thức lớp con sẽ ghi đè phương thức lớp cha.