В предыдущем вопросе вчера, в комментариях, я узнал, что в python __code__
атрибут функции изменчив. Поэтому я могу написать код следующим образом
def foo():
print "Hello"
def foo2():
print "Hello 2"
foo()
foo.__code__ = foo2.__code__
foo()
Выход
Hello
Hello 2
Я попробовал поиск в Google, но либо потому, что нет информации (я очень сомневаюсь в этом), либо ключевое слово (__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 */
};
Почему __code__
можно записывать, тогда как другие атрибуты доступны только для чтения?