我有一個奇怪的和不常見的用例,我想在基類的__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