为什么元类的__call__方法调用类,而本机类的__call__不是呢? - python

class Meta(type):
    def __call__(cls, *args, **kwargs):
        print 'Meta.__call__ called.'
        return super(Meta, cls).__call__(*args, **kwargs)


class MetaInstance(object):
    __metaclass__ = Meta

# Instantiate class.
MetaInstance()  # Meta.__call__ called.


class StandardClass(object):
    @classmethod
    def __call__(cls, *args, **kwargs):
        print 'StandardClass.__call__ called.'
        return super(StandardClass, cls).__call__(*args, **kwargs)

# Instantiate class.
StandardClass()  # StandardClass.__call__ is not called!

当实例化一个类时,为什么要在类上调用metaclass的__call__方法,而不能在本机类的__call__上调用呢?

python大神给出的解决方案

创建类实例时,将调用元类(其实例为该类的实例)__call__

# Instantiate class.
StandardClass()  # StandardClass.__call__ is not called!

当创建一个类实例然后“调用”该实例时,该类的__call__被调用。我认为用__call__装饰classmethod不会起作用。

这将调用您的元类和类的__call__:

StandardClass()()