假设我有一个元类和使用它的类:
class Meta(type):
def __call__(cls, *args):
print "Meta: __call__ with", args
class ProductClass(object):
__metaclass__ = Meta
def __init__(self, *args):
print "ProductClass: __init__ with", args
p = ProductClass(1)
输出结果如下:
Meta: __call__ with (1,)
问题:
为什么Meta.__call__
只是被触发,但是ProductClass.__init__
却没有被触发?
更新:
现在我为ProductClass
添加了__new__
方法:
class ProductClass(object):
__metaclass__ = Meta
def __new__(cls, *args):
print "ProductClass: __new__ with", args
return super(ProductClass, cls).__new__(cls, *args)
def __init__(self, *args):
print "ProductClass: __init__ with", args
p = ProductClass(1)
Meta.__call__
是否负责调用ProductClass
的__new__
和__init__
函数?
Meta.__call__()
没有返回任何内容。它需要返回作为第一个参数cls
传递的类的实例。通常可以通过调用其父(也称为基)类中同名方法来实现。这可以通过硬编码来完成,即return type.__call__(, *args)
,或者使用return super(Meta, cls).__call__(*args)
。 - martineau