【发布时间】:2011-11-21 01:39:20
【问题描述】:
假设我有一个元类和一个使用它的类:
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,)
问题:
为什么ProductClass.__init__ 没有被触发...仅仅因为Meta.__call__?
更新:
现在,我为 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)
调用ProductClass的__new__和__init__是Meta.__call__的责任吗?
【问题讨论】:
-
您的
Meta.__call__()不会返回任何内容。它需要返回它作为第一个参数cls传递的类的实例。这通常是通过在其父类(也称为基类)中调用同名方法来完成的。这可以通过硬编码来完成,即return type.__call__(, *args),或使用return super(Meta, cls).__call__(*args)。