python - 具有一组常量属性的 Init 类实例,这些实例被初始化一次

标签 python python-3.x

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

有点像

config.json

{
  "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.cOneinst2.cTwo。但我想以某种方式实现这一点,以便 MyBaseClass 仅从 config.json 读取数据一次。就像在单例中一样。我该怎么做?

最佳答案

您可以将 MyBaseClass 定义为一个元类,因此只需执行一次。

>>> class MyBaseClass(type):
...    def __new__(cls, name, bases, dct):
...        x = super().__new__(cls, name, bases, dct)
...        print('In metaclass')
...        with open('config.json', 'r') as f:
...            for key, value in json.load(f).items():
...                setattr(x, key, value)
...        return  x
...
>>>

现在,将 MyBaseClass 指定为 MyClass 的元类。

>>> class MyClass(metaclass=MyBaseClass):    
...    def __init__(self, param):
...        self.c = param
...
In metaclass
>>>

MyClass 被定义时,它只调用一次 MyBaseClass.__new__ 方法。现在,

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

将导致创建两个实例,而无需进一步读取 config.json

关于python - 具有一组常量属性的 Init 类实例,这些实例被初始化一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52710749/

相关文章:

python - 如何使用 selenium python chromedriver 循环访问多个 url 并在新选项卡中打开 url

python - 如何在 django admin 中限制内联模型的查询集

python - 如何使用 pptx python 库更改 PPT 幻灯片上项目符号列表的缩进

python - 使用 PySpark 将日期和时间字符串转换为时间戳时如何保留毫秒?

python - 将结构传递给 ctypes 中的 dll(免费)

python - tweepy api.user_timeline : count limited to 200

python - wxPython 程序只显示灰屏

python - 使用 pathlib 获取符号链接(symbolic link)的目标

android - os.system 不在同一个子 shell 中运行

Python - 抓取时出现 BeautifulSoup 错误