我有一个简单的功能:
def f():
print("heh")
实际上,当我调用f时,我调用的是它的call方法。但实际上,当我调用f的调用方法时,我调用f的调用方法,以此类推。你知道吗
python在调用f()时走了多远,它显然必须停在某个地方?你知道吗
我想知道这是否可以达到无穷大,结果是10万足以使Python崩溃。你知道吗
>>> exec('f'+100000*'.__call__'+'()')
========= RESTART ==========
这次车祸的原因是什么?你知道吗
Tags:
对对象的“调用”会导致解释器寻找调用它的方法。当通过定位一个
__call__
方法来解决这个问题时,就会调用这个方法,然后发生一些实际的事情。__call__
方法不能在自身上调用相同的机制。你知道吗在函数对象的情况下,我相信有一个内部方法表,它首先被直接查询以查看是否有一个已定义的(C语言)调用处理程序,然后被调用。也可能有一个
__call__
属性做同样的事情,但是我认为引擎首先检查表(其中一些可能在py3中被重写)。你知道吗函数的“C”语言调用处理程序被传递给函数对象的引用和参数包。函数对象包含对代码对象的引用,以及对适当全局命名空间的引用。code对象包含所需参数的描述,以及在python堆栈上实际设置调用所需的所有信息。你知道吗
当你调用一个类的方法时,有一个小小的binder对象,它有自己的调用方法(包含一个指向self和实际方法的指针)。你知道吗
我想主要的一点是,有些对象有用Python编码的
__call__
方法,但是对于许多类型,解释器在查看对象的内部类型描述符之后可以直接转到C代码。另一个例子是调用一个类型对象,比如str,在这里将调用C语言构造函数。你知道吗相关问题 更多 >
编程相关推荐