2011-11-01 1 views
8

EDIT2: Grazie a tutti per il vostro aiuto! MODIFICA: all'aggiunta di @staticmethod, funziona. Tuttavia mi sto ancora chiedendo perché sto ricevendo un errore di tipo qui.chiamando una funzione dalla classe in python - modo diverso

Ho appena iniziato OOPS e sono completamente nuovo ad esso. Ho una domanda molto basilare riguardo ai diversi modi in cui posso chiamare una funzione da una classe. Ho un file testClass.py con il codice:

class MathsOperations: 
    def __init__ (self, x, y): 
     self.a = x 
     self.b = y 
    def testAddition (self): 
     return (self.a + self.b) 

    def testMultiplication (self): 
     return (self.a * self.b) 

io chiamo questa classe da un altro file chiamato main.py con il seguente codice:

from testClass import MathsOperations 

xyz = MathsOperations(2, 3) 
print xyz.testAddition() 

Questo funziona senza problemi. Tuttavia, volevo usare la classe in un modo molto più semplice.

Ora ho inserito il seguente codice nel file testClass.py. Ho abbandonato la funzione init questa volta.

class MathsOperations: 
    def testAddition (x, y): 
     return x + y 

    def testMultiplication (a, b): 
     return a * b 

chiamando questo utilizzando;

from testClass import MathsOperations 
xyz = MathsOperations() 
print xyz.testAddition(2, 3) 

questo non funziona. Qualcuno può spiegare cosa sta succedendo in modo errato nel caso 2? Come uso questa lezione?

L'errore che ottengo è "TypeError: testAddition() prende esattamente 2 argomenti (3 data)"

risposta

14

si deve utilizzare auto come i primi parametri di un metodo

nel secondo caso è necessario utilizzare

class MathOperations: 
    def testAddition (self,x, y): 
     return x + y 

    def testMultiplication (self,a, b): 
     return a * b 

e nel codice che si possa fare la seguente

tmp = MathOperations 
print tmp.testAddition(2,3) 

se si utilizza la classe senza istanziare un primo

print MathOperation.testAddtion(2,3) 

ti dà un errore "TypeError: il metodo non legato" variabile

se si vuole fare ciò è necessario il decoratore @staticmethod

Per esempio:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

poi nel codice è possibile utilizzare

print MathsOperations.testAddition(2,3) 
+0

così il tag @staticmethod inserisce automaticamente il parametro self? –

+0

se si utilizza @staticmethod è possibile utilizzare la classe senza prima dichiarare una variabile, ad esempio, in questo caso se si tenta di utilizzare MathOperation.testAddtion (2,3) viene visualizzato un errore "TypeError: metodo non associato" –

+2

No, il decoratore staticmethod elimina la necessità del parametro self. –

1

È necessario disporre di un'istanza di una classe di usare i suoi metodi. Oppure, se non è necessario accedere a nessuna delle variabili delle classi (non parametri statici), è possibile definire il metodo come statico e può essere utilizzato anche se la classe non è istanziata. Aggiungi il decoratore @staticmethod ai tuoi metodi.

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 
    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 

docs: http://docs.python.org/library/functions.html#staticmethod

+0

Ho modificato la domanda un po '. mi dispiace per questo. –

+0

@RishavSharan Nessun problema, altre risposte menzionano già l'argomento 'self' mancante. Ma userei ancora i metodi statici se non hai bisogno di lavorare con i parametri della classe. – rplnt

2

I suoi metodi non si riferiscono ad un oggetto (cioè, auto), così si dovrebbe usare il @staticmethod decorator:

class MathsOperations: 
    @staticmethod 
    def testAddition (x, y): 
     return x + y 

    @staticmethod 
    def testMultiplication (a, b): 
     return a * b 
+0

Stavo modificando la domanda. puoi spiegare il tipo di errore qui? sto dando due argomenti onlts ma dice 3 argomenti. –

7

disclaimer: questo non è un solo per la risposta punto, è più simile a un pezzo di consulenza, anche se il la risposta può essere trovata sui riferimenti

IMHO: la programmazione orientata agli oggetti in Python fa schifo parecchio.

L'invio del metodo non è molto semplice, è necessario conoscere i metodi dell'istanza/classe (e statici!) Legati/non associati; puoi avere ereditarietà multipla e avere a che fare con legacy e nuove classi di stile (il tuo era vecchio stile) e sapere come funziona l'MRO, proprietà ...

In breve: troppo complesso, con un sacco di cose che accadono sotto il cofano . Lasciatemi dire che è unpitonico, poiché ci sono molti modi diversi per ottenere le stesse cose.

Il mio consiglio: utilizzare OOP solo quando è veramente utile. Di solito questo significa scrivere classi che implementano protocolli ben noti e integrarsi perfettamente con il resto del sistema. Non creare molte classi solo per scrivere codice orientato agli oggetti.

prendere una buona lettura per queste pagine:

li troverai molto utile.

Se si vuole veramente imparare OOP, suggerirei di iniziare con un linguaggio più convenzionale, come Java. Non è divertente come Python, ma è più prevedibile.

+0

grazie. Controllerò le pagine. –

+0

prego! a proposito, la risposta diretta è che si ottiene l'errore perché l'interprete aggiunge un parametro 'self' per i metodi associati, quindi si finisce con tre (' self' oltre ai due numeri interi forniti). – fortran

+0

ah! quella spiegazione aveva senso. Sono generalmente stanco dei documenti Python originali in quanto non sono newbie friendly, preferendo usare siti come "un byte di python". –