2010-05-07 11 views
5

voglio passare metodo di classe, come e un argomento di default ad un altro metodo di classe, in modo che possa riutilizzare il metodo come un @classmethod:Posso passare metodo di classe, come e un argomento di default ad un altro metodo di classe

@classmethod 
class foo: 
    def func1(self,x): 
     do somthing; 
    def func2(self, aFunc = self.func1): 
     # make some a call to afunc 
     afunc(4) 

Questo è il motivo per cui il metodo func2 viene chiamato all'interno della classe aFunc per default su self.func1, ma posso chiamare questa stessa funzione dall'esterno della classe e passarla ad una funzione diversa all'ingresso.

ottengo:

NameError: name 'self' is not defined

Qui è la mia messa a punto:

class transmissionLine: 
    def electricalLength(self, l=l0, f=f0, gamma=self.propagationConstant, deg=False): 

ma voglio essere in grado di chiamare electricalLength con una funzione diversa per la gamma, come:

transmissionLine().electricalLength (l, f, gamma=otherFunc) 
+0

Vedi http://stackoverflow.com/questions/3083692/using-class-static-methods-as-default-parameter-values-within-methods-of-the-same per una grande soluzione in un situazione alquanto simile. – max

risposta

9

I valori degli argomenti predefiniti vengono calcolati durante la definizione della funzione, non durante la chiamata di funzione. Quindi no, non puoi. È possibile effettuare le seguenti operazioni, però:

def func2(self, aFunc = None): 
    if aFunc is None: 
     aFunc = self.func1 
    ... 
+0

Non so davvero che io capisca completamente la domanda che sta chiedendo, ma hai certamente identificato la causa dell'errore che sta vedendo. –

1

si dovrebbe scrivere in questo modo:

class Foo(object): 
    @classmethod 
    def func1(cls, x): 
     print x 
    def func2(self, afunc=None): 
     if afunc is None: 
      afunc = self.func1 
     afunc(4) 

Anche se sarebbe utile se ti ha dato un po 'più di informazioni su ciò che si sta cercando di fare. C'è probabilmente un modo più elegante per farlo senza classmethods.

+0

@alex - quanto sopra è difficile da leggere in un commento. Modifica la tua domanda e aggiungila lì –

1

Il modo in cui stai cercando non funzionerà, perché Foo non è ancora stato definito.

class Foo: 
    @classmethod 
    def func1(cls, x): 
    print 'something: ', cls, x 

def func2(cls, a_func=Foo.func1): 
a_func('test') 

Foo.func2 = classmethod(func2) 

Foo.func2() 
+1

Ehi, so che non è davvero una soluzione dall'aspetto cool, ma la domanda era "posso passare il metodo di classe come argomento predefinito a un altro metodo di classe", e sì, si potrebbe. – evilpie

+0

Si sta passando una funzione, non un metodo di associazione qui. Il metodo binding include già il primo argomento (in questo caso è 'cls'), ma la funzione no. Prova ad usare il tuo suggerimento e vedrai che la chiamata a 'a_func' non funzionerà perché non ci sono abbastanza argomenti. – doublep

+1

Non vedo perché questo è stato downvoted. Mi sembra praticabile. doublep è sbagliato, il codice viene eseguito in Python 2.6 come scritto. –

Problemi correlati