Toán tử chồng chéo và quá tải trong python

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ử

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 đượ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
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 đượ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ử

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 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 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 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ử

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 để thêm hai đối tượng của một lớp không. Toán tử
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 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ử

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 để 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ử

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 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ử
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 cho 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 của chúng ta. 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, đây 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

Tên Biểu tượngChức năng đặc biệtBổ sung
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
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)
6Phép trừ
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)
8Phân chia
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)
0Phân chia tầng
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)
2Mô đun (hoặc Phần dư)
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)
4Công suất
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

Tên Biểu tượng Chức năng đặc biệtIncrementIncrement
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
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)
30Product
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)
31
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)
32Division
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)
33
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)
34Modulus
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)
35
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)
36Power
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)
37
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)
38

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

Tên Biểu tượngChức năng đặc biệtNhỏ hơn
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)
39
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)
30Lớn hơn
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)
31
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)
32Bằng
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)
33
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)
34Không bằng
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)
35
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)
36Nhỏ hơn hoặc bằng
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)
37
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)
38Lớn hơn hoặc bằng
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)
39
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)
32

Đã đế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ử 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

Trong ví dụ mã bên dưới, chúng ta sẽ quá tải toán tử

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 cho 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 của chúng ta,

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,

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)
34 được sử dụng để nạp chồng toán tử
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 i. e. khi toán tử
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 đượ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
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)
34 được gọ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)
39 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ử 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) 39

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 các giá trị của 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 bằng cách sử dụng toán hạng nhỏ hơn
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)
39

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

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)
33 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 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 phần đó bằng nhau thì chúng tôi kiểm tra phần ảo

Toán tử chồng lấp trong Python là gì?

Quá tải toán tử trong Python có nghĩa là cung cấp ý nghĩa mở rộng ngoài ý nghĩa hoạt động được xác định trước của chúng. Chẳng hạn, chúng ta sử dụng toán tử "+" để cộng hai số nguyên cũng như nối hai chuỗi hoặc hợp nhất hai danh sách. Chúng ta có thể đạt được điều này khi toán tử "+" được nạp chồng bởi lớp "int" và lớp "str"

Ghi đè và quá tải trong Python là gì?

Quá tải phương thức là xác định hai hoặc nhiều phương thức có cùng tên nhưng khác tham số. Python không hỗ trợ nạp chồng phương thức. Ghi đè phương thức là định nghĩa lại một phương thức của lớp cha trong lớp dẫn xuất . Ghi đè yêu cầu kế thừa để thực hiện.

Sự khác biệt giữa quá tải và ghi đè là gì?

Ghi đè xảy ra khi chữ ký phương thức giống nhau trong lớp cha và lớp con. Quá tải xảy ra khi hai hoặc nhiều phương thức trong cùng một lớp có cùng tên nhưng khác tham số

Ví dụ về nạp chồng toán tử và ghi đè toán tử là gì?

Nạp toán tử trong C++ . Ví dụ: chúng ta có thể quá tải một toán tử '+' trong một lớp như Chuỗi để chúng ta có thể nối hai chuỗi chỉ bằng cách sử dụng +. C++ has the ability to provide the operators with a special meaning for a data type, this ability is known as operator overloading. For example, we can overload an operator '+' in a class like String so that we can concatenate two strings by just using +.