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". Người dùng có thể nhận thấy rằng cùng một toán tử hoặc hàm sẵn có đang hiển thị các hành vi khác nhau cho các đối tượng thuộc các lớp khác nhau. Quá trình này được gọi là quá tải toán tử
Ví dụ
đầu ra
46 JavaTpoint 322 X Y Z X Y Z X Y Z
Làm cách nào để quá tải toán tử trong Python?
Giả sử người dùng có hai đối tượng là biểu diễn vật lý của lớp kiểu dữ liệu do người dùng định nghĩa. Người dùng phải thêm hai đối tượng bằng toán tử "+" và nó báo lỗi. Điều này là do trình biên dịch không biết cách thêm hai đối tượng. Vì vậy, người dùng phải xác định hàm để sử dụng toán tử và quá trình đó được gọi là "nạp chồng toán tử". Người dùng có thể quá tải tất cả các toán tử hiện có bằng cách họ không thể tạo bất kỳ toán tử mới nào. Python cung cấp một số hàm đặc biệt, hay có thể nói là hàm thần kỳ để thực hiện nạp chồng toán tử, hàm này sẽ tự động được gọi khi nó được liên kết với toán tử đó. Chẳng hạn, khi người dùng sử dụng toán tử "+", hàm ma thuật __add__ sẽ tự động gọi trong lệnh nơi toán tử "+" sẽ được xác định
Cách thực hiện toán tử "+" nhị phân trong Python
Khi người dùng sử dụng toán tử trên các kiểu dữ liệu do người dùng định nghĩa của lớp, thì một hàm ma thuật được liên kết với toán tử sẽ được gọi tự động. Quá trình thay đổi hành vi của toán tử đơn giản như hành vi của hàm hoặc phương thức được xác định
Người dùng định nghĩa các phương thức hoặc hàm trong lớp và toán tử hoạt động theo hành vi đó được xác định trong các hàm. Khi người dùng sử dụng toán tử "+", nó sẽ thay đổi mã của hàm ma thuật và người dùng có thêm ý nghĩa của toán tử "+"
chương trình 1. Chỉ cần thêm hai đối tượng
Chương trình Python đơn giản sử dụng toán tử nạp chồng để thêm hai đối tượng
Ví dụ
đầu ra
Please enter the value: 23 Please enter the value: 21 : 44 Please enter the value: Java Please enter the value: Tpoint : JavaTpoint
chương trình 2. định nghĩa Quá tải toán tử trong một đối tượng khác
Chương trình Python để xác định toán tử nạp chồng bên trong một đối tượng khác
Ví dụ
đầu ra
chương trình 3. Nạp chồng toán tử so sánh trong Python
Chương trình Python nạp chồng toán tử so sánh
Ví dụ
đầu ra
Trường hợp 1
Please enter the value: 23 Please enter the value: 12 The object_1 is greater than object_2
trường hợp 2
Please enter the value: 20 Please enter the value: 31 The object_2 is greater than object_1
chương trình 4. Quá tải đẳng thức và nhỏ hơn toán tử
Chương trình Python để nạp chồng đẳng thức và nhỏ hơn toán tử
Ví dụ
đầu ra
Trường hợp 1
Please enter the value: 12 Please enter the value: 23 : object_1 is less than object_2 Please enter the value: 2 Please enter the value: 2 : Both the objects are equal
trường hợp 2
Please enter the value: 26 Please enter the value: 3 : object_2 is less than object_1 Please enter the value: 2 Please enter the value: 5 : Objects are not equal
Các hàm ma thuật Python được sử dụng để nạp chồng toán tử
toán tử nhị phân
Toán tửMagic Function+__add__[self, other]-__sub__[self, other]*__mul__[self, other]/__truediv__[self, other]//__floordiv__[self, other]%__mod__[self, other]**__pow__[self . __or__[bản thân, người khác]^__xor__[bản thân, người khác]Toán tử so sánh
OperatorMagic Function__GT__[SELF, OTHER]=__GE__[SELF, OTHER]==__EQ__[SELF, OTHER]!=__NE__[SELF, OTHER]Toán tử gán
OperatorMagic Function-=__ISUB__[SELF, OTHER]+=__IADD__[SELF, OTHER]*=__IMUL__[SELF, OTHER]/=__IDIV__[SELF, OTHER]//=__IFLOORDIV__[SELF, OTHER]%=__IMOD__[SELF, OTHER . =__IOR__[TỰ, KHÁC]^=__IXOR__[TỰ, KHÁC]Toán tử một ngôi
Toán tửMagic Function-__NEG__[SELF, OTHER]+__POS__[SELF, OTHER]~__INVERT__[SELF, OTHER]Phần kết luận
Trong hướng dẫn này, chúng ta đã thảo luận về nạp chồng toán tử trong Python và cách sử dụng chúng để thực hiện các toán tử khác nhau
Những gì bạn đang yêu cầu được gọi là nhiều công văn. Xem các ví dụ ngôn ngữ Julia thể hiện các loại công văn khác nhau
Tuy nhiên, trước khi xem xét điều đó, trước tiên chúng ta sẽ giải quyết lý do tại sao quá tải không thực sự là điều bạn muốn trong Python
Đầu tiên, người ta cần hiểu khái niệm quá tải và tại sao nó không áp dụng được cho Python
Khi làm việc với các ngôn ngữ có thể phân biệt các loại dữ liệu tại thời điểm biên dịch, việc chọn trong số các lựa chọn thay thế có thể xảy ra tại thời điểm biên dịch. Hành động tạo các hàm thay thế như vậy để lựa chọn thời gian biên dịch thường được gọi là quá tải một hàm. [Wikipedia]
Python là một ngôn ngữ được gõ động, vì vậy khái niệm quá tải đơn giản là không áp dụng cho nó. Tuy nhiên, tất cả không bị mất, vì chúng ta có thể tạo các chức năng thay thế như vậy trong thời gian chạy
Trong các ngôn ngữ lập trình trì hoãn nhận dạng kiểu dữ liệu cho đến thời gian chạy, việc lựa chọn giữa các hàm thay thế phải diễn ra trong thời gian chạy, dựa trên các loại đối số hàm được xác định động. Các chức năng có cách triển khai thay thế được chọn theo cách này được gọi chung nhất là đa phương thức. [Wikipedia]
Vì vậy, chúng ta sẽ có thể thực hiện đa phương thức trong Python—hay, như cách gọi khác của nó là. nhiều công văn
Đa phương thức còn được gọi là đa công văn
Đa gửi hoặc đa phương thức là tính năng của một số ngôn ngữ lập trình hướng đối tượng trong đó một hàm hoặc phương thức có thể được gửi động dựa trên loại thời gian chạy [động] của nhiều đối số của nó. [Wikipedia]
Python không hỗ trợ điều này ngay lập tức, nhưng, khi nó xảy ra, có một gói Python tuyệt vời có tên là multidispatch thực hiện chính xác điều đó
Đây là cách chúng tôi có thể sử dụng gói multipledispatch2 để triển khai các phương pháp của bạn
>>> from multipledispatch import dispatch
>>> from collections import namedtuple
>>> from types import * # we can test for lambda type, e.g.:
>>> type[lambda a: 1] == LambdaType
True
>>> Sprite = namedtuple['Sprite', ['name']]
>>> Point = namedtuple['Point', ['x', 'y']]
>>> Curve = namedtuple['Curve', ['x', 'y', 'z']]
>>> Vector = namedtuple['Vector', ['x','y','z']]
>>> @dispatch[Sprite, Point, Vector, int]
.. def add_bullet[sprite, start, direction, speed]:
.. print["Called Version 1"]
...
>>> @dispatch[Sprite, Point, Point, int, float]
.. def add_bullet[sprite, start, headto, speed, acceleration]:
.. print["Called version 2"]
...
>>> @dispatch[Sprite, LambdaType]
.. def add_bullet[sprite, script]:
.. print["Called version 3"]
...
>>> @dispatch[Sprite, Curve, int]
.. def add_bullet[sprite, curve, speed]:
.. print["Called version 4"]
...
>>> sprite = Sprite['Turtle']
>>> start = Point[1,2]
>>> direction = Vector[1,1,1]
>>> speed = 100 #km/h
>>> acceleration = 5.0 #m/s**2
>>> script = lambda sprite: sprite.x * 2
>>> curve = Curve[3, 1, 4]
>>> headto = Point[100, 100] # somewhere far away
>>> add_bullet[sprite, start, direction, speed]
Called Version 1
>>> add_bullet[sprite, start, headto, speed, acceleration]
Called version 2
>>> add_bullet[sprite, script]
Called version 3
>>> add_bullet[sprite, curve, speed]
Called version 4
1. Python 3 hiện hỗ trợ một công văn 2. Cẩn thận không sử dụng multidispatch trong môi trường đa luồng, nếu không bạn sẽ có hành vi kỳ lạ