기본 클래스의 __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'의 서브 클래스가 메타 클래스를 갖기를 원하기 때문입니다. 그러나 필자는 여러분이 원하는대로했던 솔루션을 포함하도록 내 질문을 편집했습니다. 암시. –