【发布时间】:2012-06-20 22:33:34
【问题描述】:
在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
似乎元类魔法应用于B,但是B 没有__metaclass__ 属性。上述方法是否是将元类应用于类定义的明智方法,即使我正在定义和重新定义一个类,或者我最好简单地编写
class B(object):
__metaclass__ = MyMetaClass
pass
我认为这两种方法之间存在一些差异。
*注意,链接问题中的原始答案MyMetaClass(A.__name__, A.__bases__, A.__dict__) 返回一个TypeError:
TypeError: type() 参数 3 必须是 dict,而不是 dict_proxy
似乎A(类定义)的__dict__属性的类型为dict_proxy,而A的实例的__dict__属性的类型有一个类型dict。为什么是这样?这是 Python 2.x 与 3.x 的区别吗?
【问题讨论】:
标签: python decorator metaclass