我有一个奇怪的和不常见的用例,我想在基类的__metaclass__
被定义后修改它的子类,使它的子类自动使用新的__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__))
感谢您的提示,这并没有做到我想要的,因为我仍然希望'Foo'的子类具有元类,但是我已经编辑了我的问题以包含根据您的需要做了我需要的解决方案建议。 – 2012-01-15 06:32:34