Python 中的静态类变量和方法

2022-09-05 00:48:58

如何在Python中创建静态类变量或方法?


答案 1

在类定义中声明但不在方法内部声明的变量是类或静态变量:

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

正如 @millerdev 所指出的,这会创建一个类级变量,但这与任何实例级变量都不同,因此您可以ii

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

这与C++和Java不同,但与C#没有太大区别,C#无法使用对实例的引用来访问静态成员。

看看 Python 教程对类和类对象主题的看法

@Steve Johnson已经回答了关于静态方法的问题,这也记录在Python库参考的“内置函数”下。

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

@beidy建议使用 classmethods 而不是 staticmethod,因为该方法随后接收类类型作为第一个参数。


答案 2

@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.iititTest

虽然它没有说任何关于静态变量或方法的具体内容,但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

Pictorial Representation Of Above Example