【发布时间】:2017-01-19 18:53:38
【问题描述】:
我在 python 中有大量自动生成的类,它们基本上代表通信协议的一部分的枚举,它们看起来像这样
# definitions.py
class StatusCodes(ParamEnum):
Success = 1
Error = 2
UnexpectedAlpaca = 3
class AlpacaType(ParamEnum):
Fuzzy = 0
ReallyMean = 1
# etc etc etc
以这种方式定义事物使自动生成器和人类都可以轻松修改。 ParamEnum 类提供所有功能,从传入的网络数据获取/设置、比较、转换和创建等。
但是,这些类需要一些额外的元数据。我确实不想将它添加到每个类的源定义中,因为它降低了可读性并且会破坏自动生成器
目前我正在这样做
# param_enum.py
class ParamEnum(object):
def __init__(self):
self.__class__._metadata = get_class_metadata(self.__class__)
然而这让我觉得效率有点低,因为每次我们实例化这些枚举之一时都会发生这种情况(这种情况经常发生),而不仅仅是在定义时(元数据不会改变,所以只需要设置一次)
我尝试将其添加到定义文件的底部,但在那里也遇到了问题。
class StatusCodes(ParamEnum):
Success = 1
Error = 2
UnexpectedAlpaca = 3
for var in locals(): # or globals?
add_metadata(var)
#doesn't work because it is in the same file, modifying dict while iteratng
在 python 中是否有一种方法可以在定义类时覆盖/添加功能,可以继承到子类?理想情况下,我想要类似的东西
class ParamEnum(object):
def __when_class_defined__(cls):
add_metadata(cls)
【问题讨论】:
-
在 Python 中,类是其元类的实例。也就是说,您可以通过为您的 ParamEnum 提供一个覆盖
__new__的元类来实现此目的。
标签: python inheritance metaclass