2012-03-23 11 views
7

Me gustaría ser capaz de añadir a una clase personalizada al estilo de:Añadir a la clase personalizada en Python

x=myclass("Something", 7) 
x + 3 

7, por supuesto, se corresponde con una propiedad interior que me gustaría para incrementar añadiéndole

La clase contiene un número que hace referencia a una ubicación en una lista. Esto podría parecer algo que se puede hacer con un entero normal, pero necesito que actúe como un tipo separado. Todo esto se hace para emular un viejo lenguaje de juego. La clase es su clase 'variable', y el valor de la variable se almacena en la lista mencionada anteriormente. Aparentemente, en la versión anterior del juego, las matrices se falsificaban haciendo cálculos en la instancia del objeto variable para tomar una variable diferente. Así que estoy tratando de emular eso.

+0

La clase contiene un número que hace referencia a una ubicación en la lista. Esto podría parecer algo que se puede hacer con un entero normal, pero necesito que actúe como un tipo separado. Todo esto se hace para emular un viejo lenguaje de juego. La clase es su clase 'variable', y el valor de la variable se almacena en la lista mencionada anteriormente. Aparentemente, en la versión anterior del juego, las matrices se falsificaban haciendo cálculos en la instancia del objeto variable para tomar una variable diferente. Así que estoy tratando de emular eso. @ – Kelketek

+0

Todavía no estoy seguro de cuáles son los requisitos, pero a partir de este comentario parece más fácil derivar de 'int'. –

+0

@Kelketek: Cambié tu comentario a la pregunta, que es donde pertenece. –

Respuesta

9

Si quieres apoyar Además de las instancias de clase, es necesario definir un método __add__() en su clase:

class MyClass(object): 
    def __init__(self, x): 
     self.x = x 
    def __add__(self, other): 
     return self.x + other 

Ejemplo:

>>> a = MyClass(7) 
>>> a + 3 
10 

Para también apoyar 3 + a, defina el método __radd__() .

Si usted quiere ser capaz de actualizar el atributo de xMyClass casos utilizando

a += 3 

puede definir __iadd__().

Si desea que las instancias de clase se comporten como enteros con algunos métodos y atributos adicionales, simplemente debe derivar de int.

+0

Esto funciona. No quiero toda la funcionalidad de int. Por ejemplo, no quiero que Radd funcione en este caso. ¿Hay alguna lista de funciones en algún lugar que me muestre lo que puedo implementar? ¿Solo necesito agregar métodos de la clase int en mi clase para los que quiero apoyar? – Kelketek

+0

@Kelketek: simplemente siga cualquiera de los enlaces en la publicación para más métodos mágicos. No entiendo tu segunda pregunta. –

+1

Me encanta Python debido a características como estas. Puedes hacer prácticamente cualquier cosa en Python. – beary605

0

Lo que estás buscando hacer es sobrecargar el operador. Usted puede hacer esto en Python nuevas clases de estilo por la sobrecarga del método __add__ así:

>>> class Test(object): 
...  def __init__(self): self.prop = 3 
...  def __add__(self, x): 
...   return self.prop + x 
... 
>>> Test() + 4 
7 
>>> 
+0

Al volver a leer lo que he escrito, probablemente no debería modificar la propiedad 'prop' al hacer la adición. Whoops. –

Cuestiones relacionadas