在模块的末尾,我想获取模块中定义的类并向类添加一些属性。 (属性值是根据其他类属性计算的;我想避免在每个类定义中重复代码。我在这里找到了有关如何获取模块中定义的类列表的指南。
classmembers = inspect.getmembers(
sys.modules[__name__],
lambda member: inspect.isclass(member) and member.__module__ == __name__
)
但是如果我在模块中定义了一个 Enum 子类,我想过滤掉它。我尝试了以下方法,但没有用:
classmembers = inspect.getmembers(
sys.modules[__name__],
lambda member: inspect.isclass(member) and member.__module__ == __name__
and not isinstance(member, Enum)
)
我暂时用这个检查结果列表
for c in classmembers:
print(c)
枚举继续出现。
...
('VarFWord', <class 'table_COLR_new.VarFWord'>)
('VarFixed', <class 'table_COLR_new.VarFixed'>)
('VarUFWord', <class 'table_COLR_new.VarUFWord'>)
('extend', <enum 'extend'>)
为什么会这样?我需要更改什么才能过滤掉枚举?
我想出了一个答案。这有点出乎意料:没想到类型foo可以是 bar 的子类,但不是bar 的实例。
所以,而不是
classmembers = inspect.getmembers(
sys.modules[__name__],
lambda member: inspect.isclass(member) and member.__module__ == __name__
and not isinstance(member, Enum)
)
我只需要改成这个:
classmembers = inspect.getmembers(
sys.modules[__name__],
lambda member: (inspect.isclass(member)
and member.__module__ == __name__
and not issubclass(member, Enum))
)