class MyMeta(type):
def __new__(meta, cls, bases, attributes):
print 'MyMeta.__new__'
return type.__new__(meta, cls, bases, attributes)
def __init__(clsobj, cls, bases, attributes):
print 'MyMeta.__init__'
class MyClass(object):
__metaclass__ = MyMeta
foo = 'bar'
实现相同结果的另一种方法:
cls = "MyClass"
bases = ()
attributes = {'foo': 'bar'}
MyClass = MyMeta(cls, bases, attributes)
MyMeta
是可调用的,因此 Python 将使用特殊方法__call__
。
Python 将__call__
在MyMeta
's 类型中查找(type
在我们的例子中)
“对于新型类,特殊方法的隐式调用只有在对象类型上定义时才能保证正常工作,而不是在对象的实例字典中”
MyClass = MyMeta(...)
被解释为:
my_meta_type = type(MyMeta)
MyClass = my_meta_type.__call__(MyMeta, cls, bases, attributes)
在里面type.__call__()
我想象这样的事情:
MyClass = MyMeta.__new__(MyMeta, cls, bases, attributes)
meta_class = MyClass.__metaclass__
meta_class.__init__(MyClass, cls, bases, attributes)
return MyClass
MyMeta.__new__()
将决定如何MyClass
构建:
type.__new__(meta, cls, bases, attributes)
将为MyMeta
_MyClass
type(cls, bases, attributes)
将为MyClass