为什么 metaclass 的 __call__ 方法在 class 上调用,而原生 class 的 __call__ 却没有?
Why metaclass's __call__ method called on class, but native class's __call__ not?
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!
为什么在 class 上调用了 metaclass 的 __call__
方法,但在实例化一个 class?
因为magic methods are looked up on the class。换句话说,当您在 class 上编写 __call__
方法时,它定义了当您调用 class 的 实例 时发生的情况,而不是当您调用 class 本身时会发生什么。 class 是其 metaclass 的实例,因此在 metaclass 上定义 __call__
定义了调用 class.[=14= 时发生的情况]
您已经可以在您的示例中看到,您在这两种情况下没有做同样的事情。对于 metaclass 示例,您定义了两个东西,一个 metaclass 和一个 "meta-instance"(即常规的 class),并且您调用了第二个。对于第二个例子,你只定义了一个东西(一个class)。为了与第一个示例并行,您需要创建 StandardClass 的 实例 然后调用它,在这种情况下将调用 StandardClass.__call__
。
当您创建一个 class 实例时,元 class 的(class 是其实例)__call__
被调用。
# Instantiate class.
StandardClass() # StandardClass.__call__ is not called!
当您创建 class 实例然后 "call" 实例时,将调用 class 的 __call__
。我不认为用 classmethod
装饰 __call__
会起作用。
这将调用您的元class和class的__call__
s:
StandardClass()()
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!
为什么在 class 上调用了 metaclass 的 __call__
方法,但在实例化一个 class?
因为magic methods are looked up on the class。换句话说,当您在 class 上编写 __call__
方法时,它定义了当您调用 class 的 实例 时发生的情况,而不是当您调用 class 本身时会发生什么。 class 是其 metaclass 的实例,因此在 metaclass 上定义 __call__
定义了调用 class.[=14= 时发生的情况]
您已经可以在您的示例中看到,您在这两种情况下没有做同样的事情。对于 metaclass 示例,您定义了两个东西,一个 metaclass 和一个 "meta-instance"(即常规的 class),并且您调用了第二个。对于第二个例子,你只定义了一个东西(一个class)。为了与第一个示例并行,您需要创建 StandardClass 的 实例 然后调用它,在这种情况下将调用 StandardClass.__call__
。
当您创建一个 class 实例时,元 class 的(class 是其实例)__call__
被调用。
# Instantiate class.
StandardClass() # StandardClass.__call__ is not called!
当您创建 class 实例然后 "call" 实例时,将调用 class 的 __call__
。我不认为用 classmethod
装饰 __call__
会起作用。
这将调用您的元class和class的__call__
s:
StandardClass()()