2011-10-14 9 views
8

Tengo un Vec3D clase (ver http://pastebin.com/9Y7YbCZq)Anulación operador + en Python para el flotador + obj

Actualmente, permito Vec3D (1,0,0) + 1,2 pero me pregunto cómo debería proceder a una sobrecarga el operador + de tal manera que llegue el siguiente resultado: no se requiere

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

Código, pero sólo un toque en qué dirección debo mirar. Algo general será más útil que una aplicación específica, ya que necesito para aplicar lo mismo para la multiplicación, resta, etc.

+0

No vi el mensaje "Algo general será más útil que una implementación específica ya que necesito implementar lo mismo para la multiplicación, la resta, etc." pero el enlace en mi respuesta lo llevará a la [lista de métodos mágicos utilizados para emular un tipo numérico] (http://docs.python.org/reference/datamodel.html#emulating-numeric-types). – agf

+1

Está bien, dejé de leer después de "Estás buscando __radd__" y hice clic en el enlace :) Sin embargo, tu código lo hizo mucho más claro, así que gracias –

+0

Si tienes un __add __ personalizado personalizado para tu clase, luego, justo después de su definición, podría incluir una línea '__radd__ = __add__'. Esto funciona porque radd intercambia el orden de los argumentos por ti. –

Respuesta

10

Usted está buscando __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 

Si el objeto a la izquierda de la Además, no es compatible con agregar el objeto a la derecha, el objeto a la derecha está marcado por el método mágico __radd__.

3

implemento __radd__. Cuando llame al 3.3 + Vec3D(1,0,0), siempre que flotante no tenga el método __add__(y) siendo y y Vec3D, se invocará su versión reflejada __radd__.

Cuestiones relacionadas