在昨天的一个问题中,在评论中,我开始知道在python __code__函数中的atrribute是可变的.因此我可以编写如下代码
def foo():
print "Hello"
def foo2():
print "Hello 2"
foo()
foo.__code__ = foo2.__code__
foo()
Run Code Online (Sandbox Code Playgroud)
产量
Hello
Hello 2
Run Code Online (Sandbox Code Playgroud)
我试过谷歌搜索,但要么因为没有信息(我非常怀疑这一点),或者关键字(__code__)不容易搜索,我找不到一个用例.
它似乎不是"因为Python中的大多数东西都是可变的"也是一个合理的答案,因为函数的其他属性 - __closure__和__globals__- 是显式只读的(来自Objects/funcobject.c):
static PyMemberDef func_memberlist[] = {
{"__closure__", T_OBJECT, OFF(func_closure),
RESTRICTED|READONLY},
{"__doc__", T_OBJECT, OFF(func_doc), PY_WRITE_RESTRICTED},
{"__globals__", T_OBJECT, OFF(func_globals),
RESTRICTED|READONLY},
{"__module__", T_OBJECT, OFF(func_module), PY_WRITE_RESTRICTED},
{NULL} /* Sentinel */
};
Run Code Online (Sandbox Code Playgroud)
为什么__code__在其他属性为只读时可写?