gpt4 book ai didi

python - __call__ 是如何工作的?

转载 作者:太空狗 更新时间:2023-10-29 20:18:24 26 4
gpt4 key购买 nike

Python 的神奇方法 __call__ 会在您尝试调用对象时被调用。 Cls()() 因此等于 Cls.__call__(Cls())

函数是 Python 中的第一类对象,这意味着它们只是可调用对象(使用 __call__)。但是,__call__ 本身是一个函数,因此它也有 __call__,它也有它自己的 __call__,它也有它自己的 __call__.

所以 Cls.__call__(Cls()) 因此等于 Cls.__call__.__call__(Cls()) 并且再次等同于 Cls.__call__ .__call__.__call__(Cls()) 等等。

这个无限循环是如何结束的? __call__ 是如何实际执行代码的?

最佳答案

在幕后,Python 中的所有调用都使用相同的机制,并且几乎所有调用都到达 CPython 实现中的相同 C 函数。无论对象是具有 __call__ 方法的类的实例、函数(本身是对象)还是内置对象,所有调用(优化的特殊情况除外)都会到达函数 PyObject_Call。该 C 函数从对象的 PyObject 结构的 ob_type 字段获取对象的类型,然后从类型(另一个 PyObject 结构)获取tp_call字段,这是一个函数指针。如果 tp_call 不是 NULL,它会通过 that 调用,并使用也传递给 PyObject_Call 的 args 和 kwargs 结构>.

当一个类定义一个 __call__ 方法时,它会适本地设置 tp_call 字段。

这里有一篇文章详细解释了所有这些:Python internals: How callables work .它甚至列出并解释了整个 PyObject_Call 函数,这不是很大。如果你想在它的原生栖息地看到这个功能,它在 Objects/abstract.c 中。在 CPython repo 中。

这个 stackoverflow 问答也很重要:What is a "callable" in Python? .

关于python - __call__ 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32855927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com