元类“__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- 但因为它只是一个属性声明,它也不会引发错误。
我正在尝试了解元类。
我已经读过 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- 但因为它只是一个属性声明,它也不会引发错误。