在昨天的上一个问题中,在评论中,我开始知道在 python 中__code__
函数的属性是可变的。因此我可以编写如下代码
def foo():
print "Hello"
def foo2():
print "Hello 2"
foo()
foo.__code__ = foo2.__code__
foo()
Output
Hello
Hello 2
我尝试谷歌搜索,但要么是因为没有信息(我非常怀疑这一点),要么是关键字(__code__
)不容易搜索,我找不到这方面的用例。
“因为 Python 中的大多数东西都是可变的”似乎也不是一个合理的答案,因为函数的其他属性 -__closure__
and __globals__
- 明确只读(来自对象/funcobject.c https://github.com/python/cpython/blob/master/Objects/funcobject.c#L236):
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 */
};
为什么会__code__
是可写的,而其他属性是只读的?