2009-12-07 4 views
56

Als ich für den Aufruf einer anderen Methode in einer Klasse regulären Methoden haben, muss ich tun, um diesePython statische Methoden - wie ein Verfahren aus einer anderen Methode aufzurufen

class test: 
    def __init__(self): 
     pass 
    def dosomething(self): 
     print "do something" 
     self.dosomethingelse() 
    def dosomethingelse(self): 
     print "do something else" 

aber wenn ich statische Methoden haben kann ich nicht schreibe

self.dosomethingelse() 

weil es keine Instanz gibt. Wie muss ich in Python vorgehen, um eine statische Methode von einer anderen statischen Methode derselben Klasse aufzurufen?

Edit: was für ein Chaos. Ok, ich habe die Frage zur ursprünglichen Frage zurückgestellt. Ich habe bereits die Antwort auf die zweite Frage, die in Peter Hansens Kommentar steht. Wenn du denkst, ich sollte eine andere Frage für eine Antwort öffnen, die ich bereits habe, bitte sag es mir.

+2

@pablo: Sie nicht das Wesen der Frage ändern !! Beende diese Frage und beginne eine weitere ** !! – jldupont

+0

ok, ok. meinst du die Frage löschen? Die Antwort ist bereits in Peter Hansens Kommentar enthalten – Pablo

+0

@pablo: Sie können hier nicht löschen, das wäre nicht höflich für alle, die Antworten auf Ihre Frage beigetragen haben. Sie müssen eine Antwort akzeptieren ** und ** eine neue Frage erstellen. – jldupont

Antwort

47

class.method funktionieren sollte.

class SomeClass: 
    @classmethod 
    def some_class_method(cls): 
    pass 

    @staticmethod 
    def some_static_method(): 
    pass 

SomeClass.some_class_method() 
SomeClass.some_static_method() 
+11

Hinweis sollte hier hinzugefügt werden: Es ist klar, dass Klassenmethoden keine Nachteile gegenüber statischen Methoden haben, und Klassenmethoden ermöglicht die Methode in der Zukunft erweitert werden, um andere Klassenmethoden aufzurufen. Daher sollte es immer bevorzugt werden, auch wenn es keinen unmittelbaren Bedarf gibt. – u0b34a0f6ae

+0

** HINWEIS ** @pablo ** geändert ** die Frage !!!!! – jldupont

+1

@ u0b34a0f6ae: Ich weiß nicht, ob ich etwas Gutes tue oder nicht ... aber ich habe einen Dekorateur in einer Klasse definiert. Der Dekorateur musste eine "statische Methode" sein, keine "Klassenmethode". –

8

HINWEIS - es sieht so aus, als ob sich die Frage geändert hat. Die Antwort auf die Frage, wie Sie eine Instanzmethode von einer statischen Methode aufrufen, besteht darin, dass Sie keine Instanz als Argument übergeben oder diese Instanz in der statischen Methode instanziieren können.

Was meist folgt zu beantworten „wie Sie eine statische Methode aus einer anderen statischen Methode rufen Sie“:

Beachten Sie, dass es gibt einen Unterschied zwischen statischen Methoden und Klassenmethoden in Python. Eine statische Methode akzeptiert kein implizites erstes Argument, während eine Klassenmethode die Klasse als das implizite erste Argument verwendet (normalerweise cls per Konvention). In diesem Sinne, hier ist, wie würden Sie das tun:

Wenn es sich um eine statische Methode ist:

test.dosomethingelse() 

Wenn es ein Klassenmethode ist:

cls.dosomethingelse() 
+1

Sie können 'cls.dosomethingelse()' nur innerhalb der Klassendefinition verwenden. – jldupont

+1

Um genauer zu sein, können Sie 'cls.dosomethingelse()' nur innerhalb der Klassenmethode selbst verwenden. Genauso wie Sie 'self' nur innerhalb einer Instanzmethode selbst verwenden können. –

+1

Entschuldigung, ich habe die Frage falsch geschrieben. HOPPLA!. Ich wollte schreiben "Wie muss ich in Python tun, um eine Instanzmethode von einer anderen statischen Methode derselben Klasse aufzurufen" und nicht "Wie muss ich in Python vorgehen, um eine statische Methode von einer anderen statischen Methode derselben aufzurufen Klasse " – Pablo

2

Sie kann nicht rufen nicht-statische Methoden aus statischen Methoden, sondern durch eine Instanz innerhalb der statischen Methode zu schaffen .... es so, dass

class test2(object): 
    def __init__(self): 
     pass 

    @staticmethod 
    def dosomething(): 
     print "do something" 
     #creating an instance to be able to call dosomethingelse(),or you may use any existing instace 
     a=test2() 
     a.dosomethingelse() 

    def dosomethingelse(self): 
     print "do something else" 

test2.dosomething() 

Hoffnung arbeiten sollten, die Ihnen helfen :)

+1

IMO dieser Ansatz ist deutlich schlechter als nur '@ classmethod' zu verwenden, um Ihre Methoden zu deklarieren, und' cls.dosomethingelse() 'in' cls.dosomething() 'zu verwenden - schlechter in Bezug auf beide Leistung (Objekte instanziieren, nur um zu bekommen Zugang zu einer statischen Methode) und Lesbarkeit (es ist nicht einfach, und ich stelle mir vor, wenn diese Art von Muster Boilerplate wurde, könnte die ganze Codebasis ziemlich schwierig für einen bloßen Menschen zu analysieren) –

+0

Wie ich irgendwo anders bei SO lesen, anstatt zu initialisieren Instanz direkt eine Methode aufrufen, Sie können es einfach aufrufen - es wird sich selbst initialisieren. – Nakilon

3

ok die Hauptdeffirenz zwischen Klassenmethoden und statischen Methoden ist: Klassenmethode hat ihre eigene Identität, deshalb müssen sie von innerhalb eines INSTANCE aufgerufen werden. auf der anderen Seite statische Methode kann zwischen mehreren Instanzen gemeinsam genutzt werden, so dass es von innerhalb der Klasse

69

Wie muß ich in Python tun für den Aufruf eine statische Methode aus einer anderen statischen Methode der gleichen Klasse aufgerufen werden muss ?

class Test() : 
    @staticmethod 
    def static_method_to_call() 
     pass 

    @staticmethod 
    def another_static_method() : 
     Test.static_method_to_call() 

    @classmethod 
    def another_class_method(cls) : 
     cls.static_method_to_call() 
0

Wenn diese hängen nicht von der Klasse oder Instanz, warum dann nicht einfach eine Funktion machen? Das wäre die naheliegende Lösung. Außer natürlich, Sie denken, dass es überschrieben werden muss, Unterklasse usw. Wenn ja, dann sind die vorherigen Antworten die beste Wette. Gekreuzte Finger Ich werde nicht markiert, weil ich nur eine alternative Lösung anbiete, die für jeden geeignet ist oder nicht;).

Da die richtige Antwort auf den Anwendungsfall des Codes in Frage abhängen;) Genießen