Sind statische Klassenvariablen in Python möglich?

Ist es möglich, statische Klassenvariablen oder Methoden in Python zu haben? Welche Syntax ist dafür erforderlich?

Lösung

Variablen, die innerhalb der Klassendefinition, aber nicht innerhalb einer Methode deklariert werden, sind Klassen- oder statische Variablen:

>>> class MyClass:
...     i = 3
...
>>> MyClass.i
3 

Wie @[millerdev] (https://stackoverflow.com/questions/68645/static-class-variables-in-python#answer-69067) anmerkt, wird dadurch eine i-Variable auf Klassenebene erzeugt, die sich aber von einer i-Variable auf Instanzebene unterscheidet, so dass man auch

>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)

Dies unterscheidet sich von C++ und Java, aber nicht so sehr von C#, wo auf ein statisches Mitglied nicht mit einer Referenz auf eine Instanz zugegriffen werden kann.

Siehe was das Python-Tutorial zum Thema Klassen und Klassenobjekte zu sagen hat.

@Steve Johnson hat bereits in Bezug auf statische Methoden geantwortet, auch dokumentiert unter "Built-in Functions" in der Python Library Reference.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@beidy empfiehlt classmethods gegenüber staticmethod, da die Methode dann den Klassentyp als erstes Argument erhält, aber ich bin mir über die Vorteile dieses Ansatzes gegenüber staticmethod noch nicht ganz im Klaren. Wenn Sie auch sind, dann ist es wahrscheinlich nicht wichtig.

Kommentare (10)

Ich persönlich würde eine Klassenmethode verwenden, wenn ich eine statische Methode benötige. Vor allem, weil ich die Klasse als Argument bekomme.

class myObj(object):
   def myMethod(cls)
     ...
   myMethod = classmethod(myMethod) 

oder einen Dekorator verwenden

class myObj(object):
   @classmethod
   def myMethod(cls)

Für statische Eigenschaften.. Es ist an der Zeit, eine Python-Definition nachzuschlagen... Variablen können sich immer ändern. Es gibt zwei Arten von ihnen mutable und immutable... Außerdem gibt es Klassenattribute und Instanzattribute... Nichts wirklich wie statische Attribute im Sinne von Java & C++

Warum sollte man eine statische Methode im pythonischen Sinne verwenden, wenn sie keinerlei Bezug zur Klasse hat! Wenn ich Sie wäre, würde ich entweder classmethod verwenden oder die Methode unabhängig von der Klasse definieren.

Kommentare (2)

Statische Methoden in Python werden classmethods genannt. Schauen Sie sich den folgenden Code an

class MyClass:

    def myInstanceMethod(self):
        print 'output from an instance method'

    @classmethod
    def myStaticMethod(cls):
        print 'output from a static method'

>>> MyClass.myInstanceMethod()
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unbound method myInstanceMethod() must be called [...]

>>> MyClass.myStaticMethod()
output from a static method

Beachten Sie, dass wir beim Aufruf der Methode myInstanceMethod einen Fehler erhalten. Das liegt daran, dass diese Methode auf einer Instanz dieser Klasse aufgerufen werden muss. Die Methode myStaticMethod wird mit dem decorator @classmethod als Klassenmethode festgelegt.

Nur so zum Spaß könnten wir myInstanceMethod auf der Klasse aufrufen, indem wir eine Instanz der Klasse übergeben, etwa so:

>>> MeineKlasse.MeineInstanzMethode(MeineKlasse())
Ausgabe von einer Instanzmethode
Kommentare (1)