Python 如何使用传递给init的参数初始化类变量一次
我想在一个类的不同实例之间共享数据,但数据必须在第一次创建该类时从外部提供 我已经写了下面的片段Python 如何使用传递给init的参数初始化类变量一次,python,Python,我想在一个类的不同实例之间共享数据,但数据必须在第一次创建该类时从外部提供 我已经写了下面的片段 class Foo(object): _config = False eggs = None def __init__(self, spam, eggs=None): if Foo._config: # Assume initialized and eggs exists print(Foo.eggs)
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
我的问题是这是否是一个好方法?我看到这个问题,它建议在\uuuu init\uuuu
中包含只调用一次的东西是个坏主意,我应该使用元类
我的理由是,鸡蛋实际上将包含一个非常大的数据帧,我不想在每个实例中重复它。一种方法是创建一个
@classmethod
,您将在开始时调用它,以便实例化所有对象共享的常量值。我建议不要使用该类命名空间。
见:
变量的范围很快被稀释。我会为常量保留类名称空间
如果您试图在类名称空间中设置引用,那么您必须先生成panda数据帧。在创建对象之前,可能更容易在代码中的某个地方生成它,然后通过引用将其传递给每个类
正如@juanpa.arrivillaga:self.df=df所提到的,为什么不使用相同的大熊猫数据帧进行初始化呢?引用的成本可以忽略不计。是否希望该类的所有实例共享同一个panda数据帧,例如,从一个实例修改它将对所有实例进行修改?@juanpa.arrivillaga请原谅我的无知,但是如果数据帧是
df
,那么在中调用self.df=df
每次都会引用相同的数据帧?@Erich确切地说,yes@drstevok是,如果您将相同的df
传递给Foo
。。。Python赋值总是这样工作的。请阅读以减轻您的恐惧。我如何确保这只运行一次?我不知道有没有一个类相当于\uuuu init\uuuu
。在我们的代码库中,有一个类需要这种行为,因此我们创建了一个initialize
classmethod。当您用检查egg是否为None
时,我们检查classmethod是否至少被调用过一次。@drstevok是的,有一个类相当于\uuuuuu init\uuuuu
,元类init
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