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 将在 MyMeta 的类型中查找 __call__(在我们的例子中是 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) 将为MyClass 设置正确的元类(即MyMeta)
type(cls, bases, attributes) 将为MyClass 设置默认元类(即类型)