Python静态类变量

2024-05-03 15:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我来自C++背景,经常使用静态VARS来减少时间变量的数量(特别是初始化时间过长)。所以在StackOverflow上的其他帖子中,人们建议使用静态类变量如下:

class MyClass(object):

    StaticList1 = [...] # Very large list
    StaticList2 = [...] # Very large list

现在,如果在整个程序的执行过程中至少存在一个MyClass实例,并且列表只创建一次,那么就可以了。但是,如果在执行的某个阶段没有MyClass的实例,Python似乎会删除静态列表(我假设是因为引用计数器降为0)。在

所以我的问题是,有没有什么简单的方法不使用外部模块来初始化StaticList1和StaticList2一次(第一次使用它们),即使没有MyClass实例,也不删除它们,直到程序存在(或者手动删除列表)?在

编辑:

也许我把这个问题简单化了。我在做什么:

^{pr2}$

我从另一个脚本导入模块,并有一个如下循环:

import myclass
for i in range(10000):
    m = myclass.MyClass(i)
    d = m.data()
    # Do something with d.

静态列表的初始化大约需要200-300毫秒,并且在循环的每次迭代中都会执行,因此循环需要非常长的时间才能完成。在


Tags: 模块实例程序列表时间静态myclassvars
1条回答
网友
1楼 · 发布于 2024-05-03 15:32:07

虽然您的类确实有一个名为StaticList的静态字段,但实际上您正在初始化并使用同名的实例字段,因为您使用的是self限定符。我认为如果您使用MyClass.StaticList来初始化并访问它,您的代码将可以正常工作。在

一般来说,通过Python的名称查找,您可以通过一个实例访问一个类字段,就像它是该实例上的一个实例字段一样(例如,self.StaticList),只要您没有在该实例上实际设置一个同名的实例字段。从那一刻起,实例字段会隐藏class字段(即,self.StaticList将找到您的新值,而{}仍将引用您的类值)。在

作为口译员的新例子:

>>> class A(object):
...  v=2      # static initialization
...
>>> A.v
2
>>> a=A()     # get an instance, and
>>> a.v       # get the static value via the instance:
2
>>> a.v = 7   # but now set 'v' on the instance, and ...
>>> a.v       # we will get the instance field's value:
7
>>> A.v       # the static value is still the old:
2
>>> b=A()     # and other instances of the class ...
>>> b.v       # will use the same old static value:
2

实例变量a.v最初等于A.v,但是通过显式地设置a.v=7,就可以在该实例中“取消”它们的关联。在

虽然这意味着,原则上,您可以使用一个静态类字段MyClass.Values以及同名的实例字段{},但对于这种混淆,这通常是不可取的。在

作为一个单独的注释,您可以考虑将data方法注释为@staticmethod(并在移动过程中删除self参数),并将其称为MyClass.data(),这样可以更清楚地表明,每次调用都会返回相同的list实例。在

相关问题 更多 >