2015-06-18 16 views
8

Danh sách các toán tử chuẩn của Python bao gồm cả __add__(a, b)__concat__(a, b). Cả hai người trong số họ thường được gọi bởi a + b. Câu hỏi của tôi là, sự khác biệt giữa chúng là gì? Có một kịch bản mà một trong những sẽ được sử dụng chứ không phải là khác? Có lý do nào bạn định nghĩa cả trên một đối tượng không?Sự khác biệt giữa __add__ và __concat__ của Python là gì?

Đây là documentation Tôi tìm thấy những phương pháp nêu tại

Edit:. Thêm vào weirdness là này documentation:

Cuối cùng, các loại chuỗi cần thực hiện bổ sung (có nghĩa là nối) và phép nhân (có nghĩa là lặp lại) bằng cách xác định các phương pháp __add__(), __radd__(), __iadd__(), __mul__(), __rmul__()__imul__() được mô tả bên dưới; họ không nên xác định __coerce__() hoặc các toán tử số khác.

+0

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

+2

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

+0

* Có sự khác biệt, ngoại trừ tên không? – user2864740

Trả lời

7

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____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__).

+0

, 'toán tử' mô-đun rất hữu ích để chuyển toán tử sang' giảm() ' – fferri

+1

@mescalinum Đó là những gì tôi đã viết: *" Mô-đun chủ yếu được sử dụng khi bạn cần phải vượt qua một chức năng thực hiện một hoạt động. "* – poke

+0

ok. Tôi chỉ muốn đề cập đến 'reduce()' vì lập trình hàm rất tuyệt vời :) – fferri

3
  • operator.__add__(a, b): Return a + b, cho absố *.
  • operator.__concat__(a, b): Trả lại a + b cho abtrình tự.

Sự khác biệt là gì?

Ví dụ, bạn không thể nối các số nguyên:

>>> operator.__concat__(2,3) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: 'int' object can't be concatenated 

  • thực __add__(a, b) chỉ làm a + b, vì vậy nó hoạt động trên các chuỗi quá.
0

Theo tài liệu,

operator.__add__(a, b) Return a + b, cho a và b số.

operator.__concat__(a, b) Trả lại dấu + cho chuỗi a và b.

hành .__ thêm __ (a, b):

Nó sẽ chỉ cố gắng thực hiện a + b và đưa ra kết quả.

Ví dụ:

operator.__add__(1,2) # performs 1 + 2 
3 

operator.__add__('a','b') # performs 'a'+'b' 
'ab' 

hành .__ concat __ (a, b):

Ở đây, nó sẽ kiểm tra nếu a có thuộc tính __getitem__. Nếu nó không có thuộc tính __getitem__, nó sẽ tăng ngoại lệ nếu không, sau đó thử thực hiện a + b.

Ví dụ:

Khi thực hiện thao tác này trên các số, nó sẽ làm tăng ngoại lệ.

operator.__concat__(1,2) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError:'int' object can't be concatenated 

Khi được thực hiện trên hai chuỗi, chuỗi sẽ thực hiện nối chuỗi.

operator.__concat__('a','b') 
'ab' 
+0

Hành vi * có thực sự * khác nhau/giới hạn không? 'operator.add (" a "," b ")' tạo ra kết quả mong đợi ('" a "+" b "=>" ab "') và tài liệu nói rằng cả hai "Trả về a + b". – user2864740

+0

Lưu ý rằng OP đang nói về các mô-đun 'toán tử', không phải là các phương thức đặc biệt. Cũng lưu ý rằng không có phương thức '__concat__' đặc biệt nào. – poke

+0

đã cập nhật ans. –

Các vấn đề liên quan