假设我有一个元类和一个使用它的类:

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/

10-12 21:08