2012-06-06 16 views
8

Mögliche Duplizieren:
What is the difference between @staticmethod and @classmethod in Python?Python Statische Methoden, warum?

Ich habe ein paar Fragen zu staticmethods in Klassen. Ich werde mit einem Beispiel beginnen.

Beispiel ein:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(): 
     return "Hello %s, your age is %s" % (self.first + self.last, self.age) 

x = Static("Ephexeve", "M").printInfo() 

Ausgänge:

Traceback (most recent call last): 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 90, in <module> 
    x = Static("Ephexeve", "M").printInfo() 
    File "/home/ephexeve/Workspace/Tests/classestest.py", line 88, in printInfo 
    return "Hello %s, your age is %s" % (self.first + self.last, self.age) 
NameError: global name 'self' is not defined 

Beispiel zwei:

class Static: 
    def __init__(self, first, last): 
     self.first = first 
     self.last = last 
     self.age = randint(0, 50) 
    def printName(self): 
     return self.first + self.last 
    @staticmethod 
    def printInfo(first, last, age = randint(0, 50)): 
     print "Hello %s, your age is %s" % (first + last, age) 
     return 

x = Static("Ephexeve", "M") 
x.printInfo("Ephexeve", " M") # Looks the same, but the function is different. 

Ausgänge

Hello Ephexeve M, your age is 18 

Ich sehe, dass ich in statischen Methoden kein Selbstattribut nennen kann, ich bin mir nicht sicher, wann und warum ich es benutzen soll. Meiner Meinung nach, wenn Sie eine Klasse mit einigen Attributen erstellen, möchten Sie sie vielleicht später verwenden und haben keine statische Methode, bei der alle Attribute nicht aufrufbar sind. Kann mir jemand das erklären? Python ist meine erste Programmiersprache, also wenn das zum Beispiel in Java so ist, weiß ich nicht.

+0

Hass zu stimmen, um zu schließen, aber die Antworten in der Frage, die ich verlinkt habe, sind ziemlich gut. Beachten Sie, dass '@ classmethod' ähnlich zu javas' static' ist. '@ staticmethod' ist ziemlich nutzlos. –

+0

Danke Josh, vielleicht habe ich nicht richtig gesucht, danke für den Link, werde jetzt nachsehen –

Antwort

8

Was versuchen Sie mit dieser staticmethod zu erreichen? Wie erwarten Sie, dass es Ihr Problem löst, wenn Sie nicht wissen, was es bewirkt?

Oder spielen Sie nur herum, um zu sehen, was staticmethod tut? In diesem Fall wäre es wahrscheinlich produktiver für read the docs, was es tut, anstatt es nach dem Zufallsprinzip anzuwenden und zu versuchen, aus dem Verhalten zu erraten, was es tut.

In jedem Fall macht die Anwendung von @staticmethod auf eine Funktionsdefinition in einer Klasse eine "statische Methode". "Static" ist leider einer der am meisten überladenen Begriffe in der Programmierung; Hier bedeutet es, dass die Methode nicht von dem Objektstatus abhängt oder ihn verändert. Wenn ich eine statische Methode foo definiert in einer Klasse Bar habe, dann Aufruf bar.foo(...) (wo bar ist eine Instanz der Klasse Bar) wird genau das gleiche tun, unabhängig davon, was bar 's Attribute enthalten. In der Tat kann ich es direkt aus der Klasse als Bar.foo(...) nennen, wenn ich nicht einmal eine Instanz habe!

Dies wird erreicht, indem die Instanz einfach nicht in die statische Methode übergeben wird. Daher haben statische Methoden keinen Parameter self.

Statische Methoden sind selten notwendig, aber gelegentlich bequem. Sie sind wirklich dieselben wie einfache Funktionen, die außerhalb der Klasse definiert sind, aber wenn sie in die Klasse eingefügt werden, werden sie als mit der Klasse "assoziiert" bezeichnet. Sie würden sie im Allgemeinen zum Berechnen oder Ausführen von Dingen verwenden, die eng mit der Klasse verbunden sind, aber eigentlich keine Operationen für ein bestimmtes Objekt sind.