如何基于构造函数args初始化静态成员?

时间:2016-06-14 21:39:40

标签: python static

我需要有静态或外部列表,这些列表将由A类的每个对象使用。列表的值只需要初始化一次,并且应该从构造函数参数中获取,例如:

def initialize(x, y):
    for i in range(0, x):
        static_to_return.append([])
        for j in range(0, y):
            static_to_return[i].append((i * x) + 1 + y)
    return static_to_return


class A:
    static_member = initialize(x, y)

    def __init__(self, x, y):
        self.x = x
        self.y = y

如何使这项工作?也许最好将static_member移到另一个模块?或者是否可以在static_member函数中写入__init__

2 个答案:

答案 0 :(得分:4)

如果希望从类的第一个对象初始化静态成员,可以在类定义中将其初始化为None,并在实例构造函数中测试其值: / p>

class A:
    static_member = None

    def __init__(self, x, y):
        self.x = x
        self.y = y
        if A.static_member is None:  # still not initialized?
            A.static_member = initialize(x, y)  # ok, here it is

答案 1 :(得分:-1)

您似乎确实希望在创建时提供xy,而不是在创建实例时提供。如果所有实例都将共享相同的值,则无需将它们作为参数提供给__init__

根据您的课程的复杂程度,您可能需要使用a metaclass,但是通过这样一个简单的示例,您可以使用type

x = 1
y = 2
A = type('A', (object,), dict(x=x, y=y, static_member=initialize(x, y)))  # *

这会创建您想要的类,并且所有实例都共享您期望的状态:

>>> a = A()
>>> b = A()
>>> a.static_member
[[3, 3]]
>>> b.static_member
[[3, 3]]
>>> a.static_member.append(['foo', 'bar'])
>>> a.static_member
[[3, 3], ['foo', 'bar']]
>>> b.static_member
[[3, 3], ['foo', 'bar']]
>>> A.static_member
[[3, 3], ['foo', 'bar']]

*请注意,我需要将行static_to_return = []添加到initialize以使其运行。