2012-03-23 13 views
7

Mi piacerebbe essere in grado di aggiungere a una classe personalizzata nello stile di:Aggiungi a classe personalizzata in Python

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

7, ovviamente, corrisponde a una proprietà interiore che mi piacerebbe incrementare aggiungendo ad esso.

La classe contiene un numero che fa riferimento a una posizione in un elenco. Questo potrebbe sembrare qualcosa che può essere fatto da un numero intero normale, ma ho bisogno che funzioni come un tipo separato. Tutto ciò è fatto per emulare un vecchio linguaggio di gioco. La classe è la sua classe 'variabile' e il valore della variabile è memorizzato nell'elenco di cui sopra. Apparentemente, nella versione precedente del gioco, gli array venivano simulati facendo matematica sull'istanza dell'oggetto variabile per afferrare una variabile diversa. Quindi sto cercando di emularlo.

+0

La classe contiene un numero che si riferisce ad una posizione in un elenco. Questo potrebbe sembrare qualcosa che può essere fatto da un numero intero normale, ma ho bisogno che funzioni come un tipo separato. Tutto ciò è fatto per emulare un vecchio linguaggio di gioco. La classe è la sua classe 'variabile' e il valore della variabile è memorizzato nell'elenco di cui sopra. Apparentemente, nella versione precedente del gioco, gli array venivano simulati facendo matematica sull'istanza dell'oggetto variabile per afferrare una variabile diversa. Quindi sto cercando di emulare che @. @ – Kelketek

+0

Ancora non sono sicuro di quali siano i requisiti, ma da questo commento sembra più semplice dervie da 'int'. –

+0

@Kelketek: ho spostato il tuo commento nella domanda, a cui appartiene. –

risposta

9

Se si desidera supportare Inoltre per le istanze di classe, è necessario definire un metodo __add__() sulla tua classe:

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

Esempio:

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

Per supportare anche 3 + a, definire il metodo __radd__() .

Se si vuole essere in grado di aggiornare l'attributo x di MyClass istanze tramite

a += 3 

è possibile definire __iadd__().

Se si desidera che le istanze di classe si comportino come numeri interi con alcuni metodi e attributi aggiuntivi, è sufficiente derivare da int.

+0

Questo funziona. Non voglio tutte le funzionalità di int. Ad esempio, non voglio che radd funzioni per questo caso. C'è un elenco di funzioni da qualche parte che mi mostrerebbe cosa posso implementare? Devo solo aggiungere metodi dalla classe int sulla mia classe per quelli che voglio supportare? – Kelketek

+0

@Kelketek: basta seguire uno dei link nel post per ulteriori metodi magici. Non capisco la tua seconda domanda. –

+1

Amo Python per via di caratteristiche come queste. Puoi praticamente fare qualsiasi cosa in Python. – beary605

0

Quello che stai cercando di fare è il sovraccarico dell'operatore. È possibile farlo in python nuovi stili di classi sovraccaricando il metodo __add__ in questo modo:

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

Rileggendo ciò che ho scritto, probabilmente non dovrei modificare la proprietà 'prop' quando si aggiunge. Ops. –

Problemi correlati