初始化(复杂)静态数据成员的Pythonic方法

2024-06-10 02:19:45 发布

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

我有一个带有复杂数据成员的类,我希望它保持“静态”。我想用函数初始化一次。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附加了一些值(假设它是一个列表),那么这个添加将对其余的实例可用吗?

谢谢


Tags: and数据实例函数datadef静态成员
3条回答

语句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的所有实例。如果任何实例修改了它,则该修改将对所有其他实例可见。

下面的示例演示了这一切,其输出显示在最后:

def generate_data():
    print "Generating"
    return [1,2,3]

class coo:
    data_member = generate_data()
    def modify(self):
        self.data_member.append(4)

    def display(self):
        print self.data_member

x = coo()
y = coo()
y.modify()
x.display()

# Output:
# Generating
# [1, 2, 3, 4]

正如其他人回答的那样,您是对的——我还要注意一件事:例如,如果一个实例修改了对象coo.data_member本身

self.data_member.append('foo')

然后其他实例会看到修改。但是如果你这样做了

self.data_member = new_object

然后创建一个新的实例成员,该成员重写类成员,并且只对该实例可见,而对其他实例不可见。区别并不总是容易发现的,例如self.data_member += 'foo'self.data_member = self.data_member + 'foo'

为了避免这种情况,您可能应该始终将对象称为coo.data_member(而不是通过self)。

相关问题 更多 >