我正在尝试编写一个通用元类来跟踪子类
由于我希望这是通用的,我不想在这个元类中硬编码任何类名,因此我想出了一个生成正确元类的函数,例如:
def make_subtracker(root):
class SubclassTracker(type):
def __init__(cls, name, bases, dct):
print('registering %s' % (name,))
root._registry.append(cls)
super(SubclassTracker, cls).__init__(name, bases, dct)
return SubclassTracker
这样我可以调用它来为特定的根类生成一个元类:
__metaclass__ = make_subtracker(Root)
这是我遇到问题的地方。我不能做到这一点:
class Root(object):
_registry = []
__metaclass__ = make_subtracker(Root)
...因为Root
当我使用make_subtracker(Root)
. 我稍后尝试添加 __metaclass__ 属性,以便至少可以将其应用于子类:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
...但这不起作用。__metaclass__ 在读取类定义时进行特殊处理,如自定义类创建中所定义。
我正在寻找建议以执行此操作(在运行时更改类的元类以将其应用于其子类,或任何其他替代方法)。