Variables declared inside the class definition, but not inside a method are class or static variables:
>>> class MyClass:
... i = 3
As @Daniel points out, this creates a class-level "i" variable, but this is distinct from any instance-level "i" variable, so you could have
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
This is different from C++ and Java, but not so different from C#, where a static variable can't be accessed from an instance at all.
See what the Python tutorial has to say on the subject of classes and class objects.
@Steve Johnson has already answered regarding static methods, also documented under "Built-in Functions" in the Python Library Reference.
def f(arg1, arg2, ...): ...
@beidy recommends classmethods over staticmethod, as the method then receives the class type as the first argument, but I'm still a little fuzzy on the advantages of this approach over staticmethod. If you are too, then it probably doesn't matter.
@Blair Conrad said static variables declared inside the class definition, but not inside a method are class or "static" variables:
>>> class Test(object):
... i = 3
There are a few gotcha's here. Carrying on from the example above:
>>> t = Test()
>>> t.i # static variable accessed via instance
>>> t.i = 5 # but if we assign to the instance ...
>>> Test.i # we have not changed the static variable
>>> t.i # we have overwritten Test.i on t by creating a new attribute t.i
>>> Test.i = 6 # to change the static variable we do it by assigning to the class
Notice how the instance variable 't.i' got out of sync with the "static" class variable when the attribute 'i' was set directly on 't'. This is because 'i' was re-bound within the 't' namespace, which is distinct from the 'Test' namespace. If you want to change the value of a "static" variable, you must change it within the scope (or object) where it was originally defined. I put "static" in quotes because Python does not really have static variables in the sense that C++ and Java do.
Although it doesn't say anything specific about static variables or methods, the Python tutorial has some relevant information on classes and class objects.
@Steve Johnson also answered regarding static methods, also documented under "Built-in Functions" in the Python Library Reference.
def f(arg1, arg2, ...):
@beid also mentioned classmethod, which is similar to staticmethod. A classmethod's first argument is the class object. Example:
i = 3 # class (or static) variable
def g(cls, arg):
# here we can use 'cls' instead of the class name (Test)
if arg > cls.i:
cls.i = arg # would the the same as Test.i = arg1
摘自 功夫 熊猫