我想要一个类 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.c
是One
,inst2.c
是Two
。但我想以某种方式实现这一点,以便 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/