__call__
每当您尝试调用对象时,都会调用Python的magic方法。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函数从ob_type
对象的PyObject
结构的字段中获取对象的类型,然后从类型(另一个PyObject
结构)中获取该tp_call
字段,该字段是函数指针。如果tp_call
不是NULL
,它调用通过
这 ,与也传递给了指定参数和kwargs结构PyObject_Call
。
当类定义__call__
方法时,它将tp_call
适当地设置字段。
这是一篇详细解释所有这些内容的文章:Python内部:可调用对象如何工作。它甚至列出并解释了整个PyObject_Call
功能,这并不是很大。如果要在其原始栖息地中看到该功能,请在CPython存储库的Objects
/ abstract.c
中。
问题内容: 我知道调用类的实例时会触发类中的方法。但是,我不知道何时可以使用此特殊方法,因为一个人可以简单地创建一个新方法并执行在方法中完成的相同操作,而无需调用实例,而可以调用该方法。 如果有人给我这种特殊方法的实际用法,我将不胜感激。 问题答案: Django表单模块很好地使用了方法来实现用于表单验证的一致API。您可以将自己的表单验证程序编写为Django中的函数。 Django有一些默认的
问题内容: 编译器或OS如何区分sig_atomic_t类型和普通的int类型变量,并确保操作是原子的?两者都使用的程序具有相同的汇编代码。如何特别注意使操作原子化? 问题答案: 不是原子数据类型。仅仅是允许您在信号处理程序的上下文中使用的数据类型,仅此而已。因此最好将其名称理解为“相对于信号处理而言是原子的”。 为了保证与信号处理程序之间的通信,仅需要原子数据类型的属性之一,即读取和更新将始终看
问题内容: 我有一个Applet,它使用URLConnection通过HTTP连接加载图像。我正在为所有连接设置setUseCaches(true),但仍然看不到任何缓存行为。我图像的HTTP标头具有合理的缓存设置。如果您查看错误4528599,则有一个相当神秘的陈述: Java插件的当前版本(1.3.1)仅检查浏览器缓存中名称以.jar或.class结尾的文件。我被告知,对于Java Plug-
问题内容: 例如,当我有这样的字符串时: 当我像这样使用SQL时: 服务器到达JDK时会发生什么?它会停止并执行SQL,还是遍历字符串的其余部分然后执行SQL? 当我在与OR连接的SQL语句中有多个LIKE子句时,还会发生什么情况?它可能时会在第一个LIKE子句处停止吗? 编辑:我有这样的SQL。这可能是矫kill过正,但值得一提…每个变量都包含一个表列的LIKE子句循环。它们之间有“或”。我是否
问题内容: 首先,我要说我知道它是什么,做什么以及如何使用它。这个问题关系到它在引擎盖下的工作方式,我不希望出现“这就是如何用” 循环数组”的答案。 很长时间以来,我一直认为该方法可用于数组本身。然后,我发现了很多关于它可以与数组 副本 一起使用的事实的引用,从那时起,我一直以为这是故事的结尾。但是我最近对此事进行了讨论,经过一番实验后发现这实际上并非100%正确。 让我表明我的意思。对于以下测试
问题内容: 实际如何运作?是否可以对未指定的元素起作用?它是否偏向于具有指定元素的元素(即使它们位于顶部)? 这样的数字是否必须为负数? 或不?所有正数(以递增值表示)会以最后一个在顶部,中间在中间,第一个在底部为结尾吗? 问题答案: 允许使用负整数和正整数。 必须在元素上设置位置。 不过,在深入了解这些细节之前,让我从头开始进行解释。 每个网页都由所谓的堆栈上下文组成。从字面上看,您可以将它们视