【发布时间】:2011-04-24 08:08:34
【问题描述】:
我正在尝试编写一个通用元类来跟踪子类
因为我希望它是通用的,我不想在这个元类中硬编码任何类名,因此我想出了一个生成正确元类的函数,例如:
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
这样我可以调用它来为特定的 root 类生成一个元类:
__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__ 在读取类定义时会进行特殊处理,如Customizing class creation 中定义的那样。
我正在寻找建议以执行此操作(在运行时更改类的元类以将其应用于其子类,或任何其他替代方法)。
【问题讨论】:
-
请不要这样做。追随你的人会把它撕掉,因为它太复杂了。请使用创建适当子类对象的工厂函数。