【发布时间】:2018-06-05 19:59:48
【问题描述】:
我想“堆叠”元类。
def dec(cls):
class newmeta(cls.__metaclass__):
def __call__(cls, *args, **kwargs):
obj = cls.__metaclass__.__call__(cls, *args, **kwargs)
obj.x *= 2 #this happens AFTER __init__ is called
cls.__metaclass__ = newmeta
return cls
@dec
@dec
class Foo(object):
def __init__(self, x):
self.x = 5
print Foo().x #expect 20
但是,我似乎无法以这种方式访问Foo.__metaclass__....实际上是("__metaclass__" in Foo.__dict__) == False
如何解决这个问题?
【问题讨论】:
-
您实际上想用这个实现什么?你读过例如stackoverflow.com/q/5120688/3001761?
-
目标是在调用
__init__方法后执行一系列事件。我可能只是用 mixins 来解决它,然后在最后调用一堆超级。 -
“元类是比 99% 的用户所担心的更深层次的魔法。”如果有一种方法可以在不使用它们的情况下完成你想要的,那就去做吧。
标签: python python-2.x metaclass