2016-08-02 3 views
-1

Kann in Python innerhalb einer Klasse eine statische Methode eine andere lokale Funktion/Methode aufrufen, die in derselben Klasse definiert ist?Kann Python Staticmethod eine andere lokale Methode aufrufen?

Ich habe den folgenden Code versucht und eine Fehlermeldung erhalten, dass foo1() nicht definiert ist.

class trialOne(object): 

    @staticmethod 
    def foo1(): 
     a = 3.1 
     return a 

    @staticmethod 
    def foo(): 
     a = foo1() 
     return a 

obj = trialOne() 
b = obj.foo() 
+0

Sie sagen "lokale Methode". Das ist kein echter Begriff. Was meinst du damit? – user2357112

+0

@ user2357112: Damit meine ich eine Methode "innerhalb der gleichen Klasse definiert". – Hans

+0

Haben Sie es versucht? –

Antwort

3
class Tester: 
    def local(self): 
     print "I'm a local!" 

    @staticmethod 
    def another_stat(): 
     print "I'm a static!" 

    @staticmethod 
    def stat(inst): 
     inst.local() 
     Tester.another_stat() 


t = Tester() 
Tester.stat(t) 

# Out: 
# I'm a local! 
# I'm a static! 

Ja, Sie können! Definitionsgemäß benötigen Instanzmethoden eine Instanz, mit der sie sich verbinden können, aber solange Sie diese Instanz haben, können Sie lokale Methoden genauso aufrufen, wie Sie es normalerweise tun würden.

Um etwas tiefer hineinzugehen, gibt es nichts besonderes an dem Wort self. Das ist eine Variable wie jede andere auch. Jede Instanzmethode einer Klasse MUSS eine Instanz dieser Klasse als ihren ersten Parameter aufnehmen, und es ist Konvention, diesen Parameter self aufzurufen, aber Sie könnten genauso gut jeden anderen Namen verwenden.

Wenn es hilft Ihnen, den Unterschied zu verstehen, sind diese beiden Aussagen semantisch äquivalent:

t.local()

Tester.local(t)

Die erste für die zweite nur syntaktischer Zucker. Die zweite verwendet den Klassennamen, um auf eine Methode der Tester-Klasse zu verweisen, und übergibt dann die Instanz als ersten Parameter. Der erste gibt einfach vor, dass local ein Feld von t ist und ruft es auf, aber dieser Aufruf wird vom Python-Interpreter in Tester.local(t) umgewandelt.

Somit hat der Aufruf einer statischen Methode die gleiche Syntax wie Tester.local(t), außer dass der erste Parameter nicht eine Instanz dieser Klasse sein muss.

Also Klassenmethoden und statische Methoden werden auf die gleiche Weise aufgerufen, aber der Unterschied ist, dass eine Klassenmethode "weiß", aus welcher Klasse sie kommt. Der erste Parameter einer Klassenmethode ist immer eine Variable, die die Klasse enthält, von der sie aufgerufen wird. Auf diese Weise weiß die Methode, ob die Methode vererbt wird, von welcher Methode sie kommt, wo eine statische Methode nicht weiß. In Ihrem Kommentar, Sie sagten diese:

@classmethod 
def stat(cls): 
    cls.another_stat() 

In diesem Beispiel ist cls eine Variable, die die Klasse enthält, dass das Verfahren aus aufgerufen wird, nicht eine Instanz der Klasse, die sie aufgerufen wird von. Aus diesem Grund können Sie statische Methoden mit cls aufrufen - denn es entspricht Tester

+0

Ich nehme an, dass funktioniert, wenn die Methode eine andere statische oder Klassenmethode aufgerufen wird, solange wir die Instanz haben diese Methode assoziieren? – Hans

+0

Nicht sicher, was Sie fragen - Sie können eine statische Methode auch von einer anderen statischen Methode aufrufen, wenn Sie das fragen. Dafür brauchen Sie keine Instanz. – James

+0

Ja, darum bitte ich mich. Stimmt es, dass ich die aufgerufene statische Methode der im Beispiel verwendeten Instanz wie "inst" zuordnen muss? – Hans

Verwandte Themen