2010-05-07 14 views
5

ich will, so dass ich die Methode als @classmethod wiederverwenden kann:Kann ich geben Klassenmethode als und ein Standard-Argument an einem anderen Klassenmethode

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

Das ist der Grund, wenn die Methode func2 in der Klasse aFunc standardmäßig auf self.func1 aufgerufen wird, aber ich kann diese Funktion auch außerhalb der Klasse aufrufen und am Eingang eine andere Funktion übergeben.

ich:

NameError: name 'self' is not defined

Hier ist mein Setup:

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

Aber ich möchte in der Lage sein electricalLength rufen mit einer anderen Funktion für Gamma, wie:

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

Siehe http://stackoverflow.com/questions/3083692/using-class-static-methods-as-default-parameter-values-within-methods-of-the-same für eine große Lösung in einem etwas ähnliche Situation. – max

Antwort

9

Standardargumentwerte werden während der Funktionsdefinition und nicht während des Funktionsaufrufs berechnet. Also nein, das kannst du nicht. Sie können folgende tun, aber:

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

Obwohl es wäre hilfreich, wenn Sie ein wenig mehr Informationen über gab, was Sie versuchen zu tun:

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

Ich weiß wirklich nicht, dass ich die Frage, die er stellt, vollständig verstehe, aber Sie haben sicherlich die Ursache des Fehlers, den er sieht, erkannt. –

1

Sie es so schreiben soll. Es gibt wahrscheinlich einen eleganteren Weg, dies ohne Klassenmethoden zu tun.

+0

@alex - das obige ist schwer in einem Kommentar zu lesen. Bearbeiten Sie Ihre Frage und fügen Sie sie dort hinzu –

1

Die Art, wie Sie versuchen, wird nicht funktionieren, weil Foo noch nicht definiert ist.

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

Hey, ich weiß, das ist nicht wirklich eine pythonische cool aussehende Lösung, aber die Frage war "kann ich Klassenmethode als und ein Standardargument zu einer anderen Klassenmethode übergeben", und ja, Sie könnten. – evilpie

+0

Sie übergeben hier eine Funktion, keine Methode verbindlich. Die Methodenbindung enthält bereits das erste Argument (in diesem Fall ist es "cls"), aber die Funktion nicht. Versuchen Sie, Ihren Vorschlag zu verwenden, und Sie werden sehen, dass der Aufruf von "a_func" nicht funktioniert, weil nicht genügend Argumente vorhanden sind. – doublep

+1

Ich sehe nicht, warum das abgelehnt wurde. Es sieht für mich lebensfähig aus. doublep ist falsch, der Code läuft in Python 2.6 wie geschrieben. –

Verwandte Themen