2011-10-14 29 views
8

Tôi có một lớp Vec3D (xem http://pastebin.com/9Y7YbCZq)Override + nhà điều hành trong python cho phao + obj

Hiện nay, tôi cho phép Vec3D (1,0,0) + 1.2 nhưng tôi đang tự hỏi làm thế nào tôi nên tiến hành quá tải toán tử + theo cách sao cho tôi nhận được kết quả sau:

>>> 3.3 + Vec3D(1,0,0) 
[4.3, 3.3 , 3.3] 

Mã không bắt buộc, nhưng chỉ là gợi ý mà tôi nên xem. nói chung cái gì đó sẽ có nhiều hữu ích hơn là một thực hiện cụ thể như tôi cần phải thực hiện điều tương tự cho phép nhân, phép trừ, vv

+0

Tôi không thấy thông báo "Cái gì đó tổng quát sẽ hữu ích hơn việc triển khai cụ thể vì tôi cần triển khai cùng một phép nhân, trừ vv" một phần nhưng liên kết trong câu trả lời của tôi sẽ đưa bạn đến [danh sách các phương pháp ma thuật được sử dụng để mô phỏng một kiểu số] (http://docs.python.org/reference/datamodel.html#emulating-numeric-types). – agf

+1

Không sao, tôi đã ngừng đọc sau "Bạn đang tìm kiếm __radd__" và nhấp vào liên kết :) Tuy nhiên, mã của bạn đã làm cho nó rõ ràng hơn rất nhiều, vì vậy, cảm ơn –

+0

Nếu bạn có __add tùy chỉnh __() cho lớp học của mình, sau đó ngay sau khi định nghĩa của nó, bạn chỉ có thể bao gồm một dòng '__radd__ = __add__'. Điều này làm việc vì radd hoán đổi thứ tự đối số cho bạn. –

Trả lời

10

Bạn đang tìm kiếm __radd__:

class MyClass(object): 
    def __init__(self, value): 
     self.value = value 
    def __radd__(self, other): 
     print other, "radd", self.value 
     return self.value + other 


my = MyClass(1) 

print 1 + my 
# 1 radd 1 
# 2 

Nếu đối tượng ở bên trái của Ngoài ra không hỗ trợ thêm đối tượng ở bên phải, đối tượng bên phải được chọn cho phương thức ma thuật __radd__.

3

Bạn muốn sử dụng các phương pháp __add__ (và có thể là __radd____iadd__). Hãy xem http://docs.python.org/reference/datamodel.html#object.__add__ để biết thêm chi tiết.

+0

Nếu bạn nhìn vào câu hỏi của mình và mã anh ta liên kết, anh ta đã sử dụng '__add__'. – agf

+0

Điểm tốt. Tôi bỏ lỡ điều đó. –

3

triển khai __radd__. Khi bạn gọi 3.3 + Vec3D(1,0,0), miễn là float không có phương thức __add__(y) với y là Vec3D, phiên bản phản chiếu của bạn __radd__ sẽ được gọi.