按照这个答案,似乎可以在使用以下*定义类后更改类的元类:
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
似乎(类定义)的__dict__
属性具有类型,而实例的属性的类型具有类型。为什么是这样?这是 Python 2.x 与 3.x 的区别吗?A
dict_proxy
__dict__
A
dict