我想在一个类的不同实例之间共享数据,但是必须在第一次创建类时从外部提供数据。
我已经在下面写了这个片段。
class Foo(object):
_config = False
eggs = None
def __init__(self, spam, eggs=None):
if Foo._config:
# Assume initialized and eggs exists
print(Foo.eggs)
else:
if eggs is None:
raise ValueError('eggs must be provided the first time')
else:
Foo.eggs = eggs
Foo._config = True
print("Scrambled {}?".format(Foo.eggs))
self.spam = spam
print("Class variable - eggs: {}".format(Foo.eggs))
print("Instance variable - spam: {}".format(self.spam))
似乎有用......
>>>Foo._config
False
>>>a = Foo('chicken', 'eggs')
Scrambled eggs?
Class variable - eggs: eggs
Instance variable - spam: chicken
>>>Foo._config
True
并且第二次不会引发错误并共享类变量
>>>b = Foo('duck')
eggs
Class variable - eggs: eggs
Instance variable - spam: duck
我的问题是这是否是好的方法?我已经看到这个问题表明,在__init__
中包含只调用一次的东西是个坏主意,我应该使用元类?
我的理由是 eggs 实际上会包含一个非常大的pandas数据框,我不会在每个实例中重复这些数据框。
答案 0 :(得分:1)
我建议不要使用类名称空间。 见:
class holder():
x = 5
def __init__(self):
self.x = 6
return;
alpha = holder()
beta=holder()
beta.x = 4
holder.x = 100
print(holder.x)
print(alpha.x)
print(beta.x)
> 100
> 6
> 4
变量的范围很快被稀释。我会为常量保留类命名空间。
如果您尝试在类命名空间中设置引用,则必须先生成熊猫数据帧。在创建对象之前,可能更容易在代码中的某处生成它,然后通过引用传递给每个类。
如@ juanpa.arrivillaga所述:self.df = df
答案 1 :(得分:0)
一种方法是创建一个@classmethod
,你可以在开头调用它来实例化所有对象共享的常量值。