Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用传递给init的参数初始化类变量一次_Python - Fatal编程技术网

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