Nếu bạn kiểm tra nguồn cho operator
mô-đun (add, concat), bạn sẽ tìm thấy những định nghĩa cho những chức năng:
def add(a, b):
"Same as a + b."
return a + b
def concat(a, b):
"Same as a + b, for a and b sequences."
if not hasattr(a, '__getitem__'):
msg = "'%s' object can't be concatenated" % type(a).__name__
raise TypeError(msg)
return a + b
Vì vậy, có thực sự là không có sự khác biệt ngoại trừ concat
mà thực sự đòi hỏi một chuỗi kiểu. Cả hai chức năng đều sử dụng toán tử +
có hiệu lực phụ thuộc vào loại bạn thêm.
Nói chung, sử dụng operator
module không phải là phần lớn thời gian hữu ích. Mô-đun chủ yếu được sử dụng khi bạn cần chuyển một hàm thực hiện một thao tác, ví dụ như các chức năng chức năng như map
, filter
hoặc reduce
. Nhưng thông thường, bạn chỉ có thể sử dụng toán tử +
trực tiếp.
Đối với các chức năng gạch dưới (__add__
và __concat__
), đây là những just aliases:
__add__ = add
__concat__ = concat
Nhưng những người tất nhiên không liên quan đến special methods sử dụng để khai thác quá tải với nhiều loại tùy chỉnh.Chúng là các hàm trùng khớp với tên giống như các phương thức đặc biệt này, có thể để chúng giống nhau. Lưu ý rằng không có phương pháp đặc biệt __concat__
trên các đối tượng. Tuy nhiên
Thực hiện __add__
trên một loại tùy chỉnh sẽ ảnh hưởng đến cách điều hành chức năng mô-đun công việc, ví dụ:
>>> class Example:
def __init__ (self, x):
self.x = x
def __repr__ (self):
return 'Example({})'.format(self.x)
def __add__ (self, other):
return Example(self.x + other.x)
>>> a = Example(2)
>>> b = Example(4)
>>> operator.add(a, b)
Example(6)
>>> a + b
Example(6)
Như bạn thấy, operator.add
sẽ sử dụng thực hiện các phương pháp đặc biệt Example.__add__
; nhưng lý do cho điều đó là việc thực hiện operator.add
chỉ sử dụng toán tử +
(hành vi nào được xác định rõ ràng theo phương thức đặc biệt __add__
).
Vâng theo các tài liệu bạn liên kết với một là dành cho số và một là cho chuỗi – Craicerjack
Lưu ý rằng '__concat__' không phải là một * "magic method" * như' __add__' là: https: // docs .python.org/2/reference/datamodel.html – jonrsharpe
* Có sự khác biệt, ngoại trừ tên không? – user2864740