继this answer似乎一类元类的元类可以改变类已经被定义后,使用以下*设置类:使用装饰
class MyMetaClass(type):
# Metaclass magic...
class A(object):
pass
A = MyMetaClass(A.__name__, A.__bases__, dict(A.__dict__))
定义功能
def metaclass_wrapper(cls):
return MyMetaClass(cls.__name__, cls.__bases__, dict(cls.__dict__))
让我一个装饰应用于类定义像这样,
@metaclass_wrapper
class B(object):
pass
它看ms表明元类魔术应用于B
,但B
没有__metaclass__
属性。是上述方法来元类应用类定义一个合理的方式,即使我definiting并重新definiting类,或者我会过得更好只是写
class B(object):
__metaclass__ = MyMetaClass
pass
我相信有这两者之间的一些差异方法。
*注意,在链接的问题,MyMetaClass(A.__name__, A.__bases__, A.__dict__)
原来的答案,返回TypeError
:
TypeError: type() argument 3 must be a dict, not dict_proxy
看来的A
(类定义)的__dict__
属性有一个类型dict_proxy
,而__dict__
属性的类型实例的A
的类型为dict
。为什么是这样?这是一个Python 2.x与3.x的区别吗?
我只是想知道是否有一个装饰器等效于在类定义中设置__metaclass__属性。我想我的问题的另一部分是我的'装饰'似乎*工作,但我注意到,装饰类没有'__metaclass__'属性,所以这两种方法之间显然是有区别的;为什么是这样? – Chris