元类“__call__”方法未在实例化时调用

metaclass `__call__` method not called at instanciation

我正在尝试了解元类。

我已经读过 this answer 并且我尝试像这样使用自定义 __call__ :

#!/usr/bin/env python3                                                                                               

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


class Test:
    __metaclass__ = MetaTest


if __name__ == '__main__':
    Test()

我希望 Test.__class__.__call__ 在实例化时被调用,而 Test.__class__MetaTest 的一个实例,但事实并非如此,因为当 运行这个脚本。

那么 为什么 MetaTest.__call__Test 实例化 时不被调用?

您正在为 metaclasses 使用 Python 2 语法 - 但您的 shebang 行和标签表明您 运行 它在 Python 3.

只需更改您的 class 声明以使用 Python' 3 方式声明元 class:

#!/usr/bin/env python3                                                                                               

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


class Test(metaclass=MetaTest):
    pass

if __name__ == '__main__':
    Test()

在 class 主体上声明一个 __metaclass__ 属性对 Python 没有影响 3- 但因为它只是一个属性声明,它也不会引发错误。