Python无限调用属性

2024-03-29 08:00:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的功能:

def f():
    print("heh")

实际上,当我调用f时,我调用的是它的call方法。但实际上,当我调用f的调用方法时,我调用f的调用方法,以此类推。你知道吗

python在调用f()时走了多远,它显然必须停在某个地方?你知道吗

我想知道这是否可以达到无穷大,结果是10万足以使Python崩溃。你知道吗

>>> exec('f'+100000*'.__call__'+'()')

========= RESTART ==========

这次车祸的原因是什么?你知道吗


Tags: 方法功能def地方原因callexecrestart
1条回答
网友
1楼 · 发布于 2024-03-29 08:00:56

对对象的“调用”会导致解释器寻找调用它的方法。当通过定位一个__call__方法来解决这个问题时,就会调用这个方法,然后发生一些实际的事情。__call__方法不能在自身上调用相同的机制。你知道吗

在函数对象的情况下,我相信有一个内部方法表,它首先被直接查询以查看是否有一个已定义的(C语言)调用处理程序,然后被调用。也可能有一个__call__属性做同样的事情,但是我认为引擎首先检查表(其中一些可能在py3中被重写)。你知道吗

函数的“C”语言调用处理程序被传递给函数对象的引用和参数包。函数对象包含对代码对象的引用,以及对适当全局命名空间的引用。code对象包含所需参数的描述,以及在python堆栈上实际设置调用所需的所有信息。你知道吗

当你调用一个类的方法时,有一个小小的binder对象,它有自己的调用方法(包含一个指向self和实际方法的指针)。你知道吗

我想主要的一点是,有些对象有用Python编码的__call__方法,但是对于许多类型,解释器在查看对象的内部类型描述符之后可以直接转到C代码。另一个例子是调用一个类型对象,比如str,在这里将调用C语言构造函数。你知道吗

相关问题 更多 >