@Ene Uran: Staticmethoden != "Instanzmethoden".
Ein Instanzmethode kann nur über die Instanz der Klasse benutzt werden.
``Foo().Bar()`` <- ``Foo()'' (Man achte auf die Klammern) erzeugt ein Objekt (Instanz) der Klasse ``Foo``. ``.Bar()`` ruft die "Instanzmethoden" für die eben erzeugt Instanz auf.
``Foo.Bar()`` <- Ruft die Staticmethoden der Klasse ``Foo`` auf.
Das schöne an statischen Methoden ist, das man eine Klasse als Namencpace benutzen kann (Die *nicht* zur instanziierung gedacht ist!) um zusammengehöriges in besagten zu kapseln. Bei Attributen ist das trivial, da man sie als Klassenattribute definiert:
Code: Alles auswählen
class Foo(object):
attr1 = None
attr2 = None
print Foo.attr1
Bei Methoden wird es unschön wenn sie als Instanzmethoden defineirt werden, da man immer erst eine Instanz bilden muss um die Methode aufzurufen: In anderen Worten: Ich muss vor dem Klassennamen eine öffnenden und schließenden Klammer schreiben:
Code: Alles auswählen
class Foo(object):
attr1 = None
attr2 = None
def Bar(self):
pass
print Foo.attr1
Foo().Bar() # :-[
Hier kommt nun ``@staticmethod`` ins spiel mit dem es nicht notwendig ist die klasse zu instanziieren:
Code: Alles auswählen
class Foo(object):
attr1 = None
attr2 = None
@staticmethod
def Bar(self):
pass
print Foo.attr1
Foo.Bar() # :-)
Ich nutze das Feature gelegentlich für Objekte die ein Namenspace, und nicht mehr, sein sollen, in dem Konstanten und statische Methoden als Modifikatoren definiert sind, um alles unter einem Namen zusammenzufassen. So muss ich nicht extra ein Module schreiben um zusammengehöriges in einem Namensraum zusammenzufassen, sondern es langt einfach eine Klasse dafür