python 中函数对象有一个 __code__ 属性(它也是一个 code 对象)保存了函数定义中的实际代码。 通过它可以获取到一些该函数的元信息,比如 __code__.co_argcount 可以查看函数参数个数, __code__.co_code 可以查看函数的字节码。
虽然 __code__ 本身是一个只读对象,但是 function对象本身是可以修改的,所以如果我们可以将它的 .__code__ 属性替换掉。比如
- def foo():
- return "foo"
-
- def bar():
- return "bar"
-
- # 开始换脑
- bar.__code__ = foo.__code__
- return bar()
-
- foo