gpt4 book ai didi

python - 为什么内置函数的__self__返回它所属的内置模块?

转载 作者:太空狗 更新时间:2023-10-29 17:19:37 25 4
gpt4 key购买 nike

方法有一个属性,__self__,当底层函数被调用时,它保存要传递的实例。显然,内置函数也是如此。

在 Python 3 中,它们持有模块对象:

>>> len.__self__
<module 'builtins' (built-in)>
>>> sys.getrefcount.__self__ # also for other builtin modules
<module 'sys' (built-in)>

另一方面,在 Python 2 中,它们持有 None:

>>> type(len.__self__)
<type 'NoneType'>
>>> sys.getrefcount.__self__
<type 'NoneType'>

有谁知道为什么这里会出现差异?除此之外,为什么这些甚至有一个 __self__ 而不像 Python 级别的模块函数缺少 __self__ 属性:

>>> from pprint import pprint
>>> pprint.__self__
AttributeError: 'function' object has no attribute '__self__'

最佳答案

感谢 issue14003,我相信我已经找到了差异的原因.这似乎是由于模块创建 API 从 Python 2 到 3 发生了变化。

在 Python 2 中,在使用 Py_InitModule4 构建模块期间,一个 PyObject *self 参数可用,如果扩展模块的编写者希望的话,它可以具有 None 的值,如文档所示:

If self is non-NULL, it will be passed to the functions of the module as their (otherwise NULL) first parameter

大部分内置标准库模块apparently chose that path因此 builtin_function.__self__ 的结果是 None:

mod = Py_InitModule4("__builtin__", builtin_methods,
builtin_doc, (PyObject *)NULL,
PYTHON_API_VERSION);

在 Python 3 中,用于创建模块的 API 发生了变化,该选项消失了。创建模块的功能,PyModule_Create2 , 不采用允许为 Noneself 参数。相反,它调用 PyModule_AddFunctions (调用内部 _add_methods_to_object 将函数添加到模块)并无条件地将内置函数的 __self__ 属性设置为模块。

这就是为什么 len 返回 builtins 模块的原因。据我所知,它没有在函数体内的任何地方使用,因此它的用途在任何方面都不是特别的。


支持@user2357112 让我觉得很傻,builtin_methodbuiltin_function 实际上是the same struct因此,内置函数共享方法中的 __self__ 属性是有意义的。

另一方面,function 类型实际上没有任何意义,因为它不以任何方式与 method 类型共享。

关于python - 为什么内置函数的__self__返回它所属的内置模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42909041/

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