Làm thế nào để một lớp Python xử lý quá tải toán tử?

Các toán tử được sử dụng trong Python để thực hiện các thao tác cụ thể trên các toán hạng đã cho. Hoạt động mà bất kỳ toán tử cụ thể nào sẽ thực hiện trên bất kỳ loại dữ liệu được xác định trước nào đã được xác định trong Python

Mỗi toán tử có thể được sử dụng theo một cách khác nhau cho các loại toán hạng khác nhau. Ví dụ: toán tử + được sử dụng để cộng hai số nguyên để cho kết quả là một số nguyên nhưng khi chúng ta sử dụng nó với toán hạng float thì kết quả là một giá trị float và khi + được sử dụng với toán hạng chuỗi thì nó sẽ nối hai toán hạng được cung cấp

Hành vi khác nhau này của một toán tử đối với các loại toán hạng khác nhau được gọi là Nạp chồng toán tử. Việc sử dụng toán tử + với các loại toán hạng khác nhau được hiển thị bên dưới

>>> x=10
>>> y=20
>>> x+y
30

>>> z=10.4
>>> x+z
20.4

>>> s1 = 'hello '
>>> s2 = 'world'
>>> s1+s2
'hello world'

Nhà điều hành + có thể thêm gì không?

Câu trả lời là Không, nó không thể. Bạn có thể sử dụng toán tử + để thêm hai đối tượng của một lớp không. Toán tử + có thể thêm hai giá trị số nguyên, hai giá trị float hoặc chỉ có thể được sử dụng để nối hai chuỗi vì các hành vi này đã được xác định trong python

Vì vậy, nếu bạn muốn sử dụng cùng một toán tử để thêm hai đối tượng của một số lớp do người dùng xác định thì bạn sẽ phải tự xác định hành vi đó và thông báo cho python về điều đó

Nếu bạn vẫn chưa rõ, hãy tạo một lớp và thử sử dụng toán tử + để thêm hai đối tượng của lớp đó,

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]

Traceback [cuộc gọi gần đây nhất cuối cùng]. Tệp "/tmp/sessions/1dfbe78bb701d99d/main. py", dòng 7, inprint["sum = ", c1+c2] TypeError. [các] loại toán hạng không được hỗ trợ cho +. 'Phức hợp' và 'Phức hợp'

Vì vậy, chúng ta có thể thấy rằng toán tử + không được hỗ trợ trong lớp do người dùng định nghĩa. Nhưng chúng ta có thể làm điều tương tự bằng cách nạp chồng toán tử + cho lớp của chúng ta

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
2. Nhưng làm thế nào chúng ta có thể làm điều đó?

Các hàm đặc biệt trong Python

Các hàm đặc biệt trong python là các hàm dùng để thực hiện các tác vụ đặc biệt. Các hàm đặc biệt này có tiền tố và hậu tố tên là

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
3 như chúng ta thấy trong phương thức
class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
4 cũng là một hàm đặc biệt. Một số chức năng đặc biệt được sử dụng để nạp chồng toán tử được hiển thị bên dưới

toán tử toán học

Dưới đây chúng tôi có tên của các chức năng đặc biệt để quá tải các toán tử toán học trong python

NameSymbolSpecial FunctionAddition+
class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
6Subtraction
class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
7
class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
8Division
class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
9
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
0Floor Division
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
1
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
2Modulus[or Remainder]
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
3
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
4Power
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
5
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
6

Toán tử chuyển nhượng

Dưới đây chúng ta có tên của các hàm đặc biệt để quá tải toán tử gán trong python

NameSymbolSpecial FunctionIncrement
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
7
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
8Decrement
class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]
9+0Product+1+2Division+3+4Modulus+5+6Power+7+8

Toán tử quan hệ

Dưới đây chúng tôi có tên của các chức năng đặc biệt để quá tải các toán tử quan hệ trong python

NameSymbolSpecial FunctionLess than+9+0Greater than+1+2Equal to+3+4Not equal+5+6Less than or equal to+7+8Greater than or equal to+9+2

Đã đến lúc xem một số ví dụ mã trong đó chúng ta thực sự sử dụng các hàm đặc biệt được chỉ định ở trên và quá tải một số toán tử

Quá tải toán tử +

Trong ví dụ mã dưới đây, chúng tôi sẽ quá tải toán tử + cho lớp của chúng tôi

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
2,

class Complex:
    # defining init method for class
    def __init__[self, r, i]:
        self.real = r
        self.img = i

    # overloading the add operator using special function
    def __add__[self, sec]:
        r = self.real + sec.real
        i = self.img + sec.img
        return complx[r,i]

    # string function to print object of Complex class
    def __str__[self]:
        return str[self.real]+' + '+str[self.img]+'i'

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ",c1+c2]

tổng = 7 + 7i

Trong chương trình trên, +4 được sử dụng để quá tải toán tử + i. e. khi toán tử + được sử dụng với hai đối tượng lớp

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
2 thì hàm +4 được gọi

+9 là một chức năng đặc biệt khác được sử dụng để cung cấp định dạng của đối tượng phù hợp để in

Quá tải toán tử +9

Bây giờ, hãy nạp chồng toán tử nhỏ hơn để chúng ta có thể dễ dàng so sánh hai giá trị của đối tượng lớp

class Complex:
    def __init__[self, r, i]:
        self.real = r
        self.img = i

c1 = Complex[5,3]
c2 = Complex[2,4]
print["sum = ", c1+c2]
2 bằng cách sử dụng toán hạng nhỏ hơn +9

Như chúng ta đã biết, để làm như vậy, chúng ta phải định nghĩa hàm đặc biệt +3 trong lớp của chúng ta

Dựa trên yêu cầu so sánh đối tượng lớp, bạn có thể xác định logic cho các chức năng đặc biệt để ghi đè toán tử. Trong đoạn mã trên, chúng tôi đã ưu tiên cho phần thực của số phức, nếu phần đó nhỏ hơn thì toàn bộ số phức nhỏ hơn, nếu bằng nhau thì chúng tôi kiểm tra phần ảo

Python xử lý quá tải toán tử như thế nào?

Trong Python, quá tải được thực hiện bằng cách ghi đè phương thức dành riêng cho toán tử đó, trong lớp do người dùng định nghĩa . Ví dụ: __add__[self, x] là phương thức dành riêng cho nạp chồng toán tử + và __eq__[self, x] dành cho nạp chồng ==.

Python có hỗ trợ quá tải toán tử không?

Chúng tôi có thể quá tải tất cả các toán tử hiện có nhưng chúng tôi không thể tạo toán tử mới. Để 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 gọi tự động khi nó được liên kết với toán tử cụ thể đó

Chủ Đề