我正在尝试编写一个通用的元类来跟踪子类。
由于我希望这是通用的,所以我不想在这个元类中硬编码任何类名,因此我想出了一个函数来生成正确的元类,例如:
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)
...因为当我使用 make_subtracker(Root)
时,Root
还没有被定义。我尝试稍后添加 __metaclass__ 属性,以便至少可以应用于子类:
class Root(object):
_registry = []
Root.__metaclass__ = make_subtracker(Root)
...但这并不起作用。当类定义被读取时,__metaclass__有特殊的处理方式,详见自定义类创建。
我正在寻求建议以实现此目标(无论是在运行时更改类的元类使其应用于其子类,还是采用其他替代方案)。