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
Sie sagen "lokale Methode". Das ist kein echter Begriff. Was meinst du damit? – user2357112
@ user2357112: Damit meine ich eine Methode "innerhalb der gleichen Klasse definiert". – Hans
Haben Sie es versucht? –