【发布时间】:2012-02-10 15:04:16
【问题描述】:
我有一个奇怪且不寻常的元类用例,我想在定义基类后更改其__metaclass__,以便其子类将自动使用新的__metaclass__。但这奇怪地不起作用:
class MetaBase(type):
def __new__(cls, name, bases, attrs):
attrs["y"] = attrs["x"] + 1
return type.__new__(cls, name, bases, attrs)
class Foo(object):
__metaclass__ = MetaBase
x = 5
print (Foo.x, Foo.y) # prints (5, 6) as expected
class MetaSub(MetaBase):
def __new__(cls, name, bases, attrs):
attrs["x"] = 11
return MetaBase.__new__(cls, name, bases, attrs)
Foo.__metaclass__ = MetaSub
class Bar(Foo):
pass
print(Bar.x, Bar.y) # prints (5, 6) instead of (11, 12)
我正在做的事情很可能是不明智的/不受支持的/未定义的,但我一生都无法弄清楚旧的元类是如何被调用的,而且我最不想了解这是怎么可能的。
编辑:根据jsbueno 提出的建议,我将Foo.__metaclass__ = MetaSub 行替换为以下行,这正是我想要的:
Foo = type.__new__(MetaSub, "Foo", Foo.__bases__, dict(Foo.__dict__))
【问题讨论】: