我有一个带有复杂数据成员的类,我希望它保持“静态”。我想用函数初始化一次。Python是这样的:
def generate_data():
... do some analysis and return complex object e.g. list ...
class Coo:
data_member = generate_data()
... rest of class code ...
函数generate_data
需要很长时间才能完成并返回在运行程序范围内保持不变的数据。我不希望每次类Coo被实例化时都运行它。
另外,为了验证,只要我不给__init__
中的data_member
分配任何东西,它就会保持“静态”?如果Coo中的一个方法向data_member
附加了一些值(假设它是一个列表),那么这个添加将对其余的实例可用吗?
谢谢
语句
data_member = generate_data()
只在执行class coo: ...
时执行一次。在大多数情况下,类语句发生在模块级,并在导入模块时执行。因此,当您第一次导入类为coo
的模块时,data_member = generate_data()
将只执行一次。所有
coo
类的实例都将共享data_member
,并可以通过编写coo.data_member
来访问它。对coo.data_member
所做的任何更改都将立即由任何coo
实例可见。实例可以有自己的data_member
属性。此属性可以通过键入self.data_member = ...
来设置,并且仅对该实例可见。“static”data_member
仍然可以通过键入coo.data_member
来访问。你在所有方面都是对的。
data_member
将创建一次,并可用于coo
的所有实例。如果任何实例修改了它,则该修改将对所有其他实例可见。下面的示例演示了这一切,其输出显示在最后:
正如其他人回答的那样,您是对的——我还要注意一件事:例如,如果一个实例修改了对象
coo.data_member
本身然后其他实例会看到修改。但是如果你这样做了
然后创建一个新的实例成员,该成员重写类成员,并且只对该实例可见,而对其他实例不可见。区别并不总是容易发现的,例如
self.data_member += 'foo'
与self.data_member = self.data_member + 'foo'
。为了避免这种情况,您可能应该始终将对象称为
coo.data_member
(而不是通过self
)。相关问题 更多 >
编程相关推荐