Python 中的静态类变量和方法
2022-09-05 00:48:58
如何在Python中创建静态类变量或方法?
在类定义中声明但不在方法内部声明的变量是类或静态变量:
>>> class MyClass:
... i = 3
...
>>> MyClass.i
3
正如 @millerdev 所指出的,这会创建一个类级变量,但这与任何实例级变量都不同,因此您可以i
i
>>> m = MyClass()
>>> m.i = 4
>>> MyClass.i, m.i
>>> (3, 4)
这与C++和Java不同,但与C#没有太大区别,C#无法使用对实例的引用来访问静态成员。
@Steve Johnson已经回答了关于静态方法的问题,这也记录在Python库参考的“内置函数”下。
class C:
@staticmethod
def f(arg1, arg2, ...): ...
@beidy建议使用 classmethods 而不是 staticmethod,因为该方法随后接收类类型作为第一个参数。
@Blair Conrad说,在类定义内部声明的静态变量,而不是在方法内部声明的静态变量是类或“静态”变量:
>>> class Test(object):
... i = 3
...
>>> Test.i
3
这里有一些陷阱。从上面的例子继续:
>>> t = Test()
>>> t.i # "static" variable accessed via instance
3
>>> t.i = 5 # but if we assign to the instance ...
>>> Test.i # we have not changed the "static" variable
3
>>> t.i # we have overwritten Test.i on t by creating a new attribute t.i
5
>>> Test.i = 6 # to change the "static" variable we do it by assigning to the class
>>> t.i
5
>>> Test.i
6
>>> u = Test()
>>> u.i
6 # changes to t do not affect new instances of Test
# Namespaces are one honking great idea -- let's do more of those!
>>> Test.__dict__
{'i': 6, ...}
>>> t.__dict__
{'i': 5}
>>> u.__dict__
{}
请注意,当直接在 上设置属性时,实例变量如何与“静态”类变量不同步。这是因为在命名空间中重新绑定,这与命名空间不同。如果要更改“静态”变量的值,则必须在最初定义它的作用域(或对象)内更改它。我把“static”放在引号里,因为Python并没有真正像C++和Java那样的静态变量。t.i
i
t
i
t
Test
虽然它没有说任何关于静态变量或方法的具体内容,但Python教程有一些关于类和类对象的相关信息。
@Steve Johnson还回答了关于静态方法的问题,这也记录在Python库参考的“内置函数”下。
class Test(object):
@staticmethod
def f(arg1, arg2, ...):
...
@beid还提到了类方法,它类似于静态方法。类方法的第一个参数是类对象。例:
class Test(object):
i = 3 # class (or static) variable
@classmethod
def g(cls, arg):
# here we can use 'cls' instead of the class name (Test)
if arg > cls.i:
cls.i = arg # would be the same as Test.i = arg1