如何使用传递给init的参数初始化类变量一次

时间:2017-07-19 22:28:53

标签: 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)

        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数据框,我不会在每个实例中重复这些数据框。

2 个答案:

答案 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,你可以在开头调用它来实例化所有对象共享的常量值。