假设我有一个元类和一个使用它的类:
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 的
Meta.__call__
和 __new__
是 __init__
的责任吗? 最佳答案
扩展方法和覆盖方法之间的 OOP 存在差异,您刚刚在元类 Meta
中所做的称为覆盖,因为您定义了 __call__
方法并且没有调用父 __call__
。要获得您想要的行为,您必须通过调用父方法来扩展 __call__
方法:
class Meta(type):
def __call__(cls, *args):
print "Meta: __call__ with", args
return super(Meta, cls).__call__(*args)
关于python - 元类的 "__call__"和实例的 "__init__"的关系?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7485324/