首页 > 解决方案 > 初始化具有一组常量属性的类实例,这些属性被初始化一次

问题描述

我想要一个类的一些实例MyClass,它们共享一些从文件中读取的常量属性,但也有具有实例唯一值的属性。但是,我只想为所有实例读取一次文件。

就像是

配置文件

{
  "a": 1,
  "b": 2,
}

然后类定义:

class MyBaseClass:

    def __new__(cls):
        with open('config.json', 'r') as f:
            for key, value in json.load(f).items():
                setattr(cls, key, value)

class MyClass(MyBaseClass):

    def __init__(self, param):
        self.c = param

当我初始化实例时MyClass,我想要

inst1 = MyClass("One")
inst2 = MyClass("Two")

拥有inst1.cisOneinst2.cis Two。但我想以某种方式实现这一点,以便 MyBaseClassconfig.json只读取一次数据。就像单身一样。我该怎么做?

标签: pythonpython-3.x

解决方案


您已经拥有了大部分框架。首次创建类时会运行许多代码。最简单的使用是类体本身。您可以使用它来创建一个包含所需属性的类变量,其中包含您在此处显示的片段:

class MyBaseClass:
    with open('config.json', 'r') as f:
        attributes = json.load(f)

    def __new__(cls):
        self = super().__new__(cls)
        self.__dict__.update(cls.attributes)

在类运行后保留在类命名空间中的任何名称都将成为类变量,而不仅仅是方法。仅当您有一个不使用插槽或具有冲突属性的常规类时,更新字典才有效。在这些情况下,请setattr__new__.


推荐阅读