我需要有静态或外部列表,这些列表将由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__
?
答案 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)
您似乎确实希望在创建类时提供x
和y
,而不是在创建实例时提供。如果所有实例都将共享相同的值,则无需将它们作为参数提供给__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
以使其运行。