python - 初始化具有一组常量属性的类实例,这些属性被初始化一次
问题描述
我想要一个类的一些实例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.c
isOne
和inst2.c
is Two
。但我想以某种方式实现这一点,以便 MyBaseClassconfig.json
只读取一次数据。就像单身一样。我该怎么做?
解决方案
您已经拥有了大部分框架。首次创建类时会运行许多代码。最简单的使用是类体本身。您可以使用它来创建一个包含所需属性的类变量,其中包含您在此处显示的片段:
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__
.
推荐阅读
- python - HTML 到 Word 文档
- python - 使用排序列更有效地获取数据框中最小元素的整体分布
- angular - 在所有组件中导入所有模型是不好的做法吗?
- windows - git - 切换到本地开发,然后返回功能分支重置修改/添加文件的状态
- mysql - 在这种情况下,是什么导致 MySQL 错误 1071(密钥太长)?
- reactjs - 使用 Reactjs 显示每个表单提交的 Json 响应数据
- android - 如何在 Xamarin Android 中获取导航栏高度?
- powershell - 从模块导出函数时,延迟绑定脚本块不起作用
- wayland - Wayland 和显示待机
- postgresql - PostgreSQL:NOT IN 子句导致“列太多”错误