Python 反射 - 我可以用它获取方法定义的源代码吗

12 投票
4 回答
7941 浏览
提问于 2025-04-15 11:12

重复的问题..


我有一个方法的定义,它运行得很好,但我想在运行时修改它。

比如说:如果我有一个方法

def sayHello():
    print "Hello"

当我输入type(sayHello)时,得到的结果是'type function'。我能否获取这个函数对象的源代码字符串?这会被认为是一个安全问题吗?

4 个回答

3

sayHello.func_code.co_code 返回一个字符串,我觉得里面包含了这个方法的编译代码。因为 Python 在内部会把代码编译成虚拟机的字节码,所以这可能就是剩下的全部内容。

不过,你可以对它进行反汇编:

import dis

def sayHello():
  print "hello"

dis.dis(sayHello)

这会打印出:

   1           0 LOAD_CONST               1 ('hello')
               3 PRINT_ITEM
               4 PRINT_NEWLINE
               5 LOAD_CONST               0 (None)
               8 RETURN_VALUE

你可以看看 Decompyle 这个反编译工具。

5

要获取一个类实例中方法的源代码,可以这样做:

import inspect
myobj = MyModel()
print inspect.getsource(myobj.my_method)

想了解更多,可以查看这里: https://docs.python.org/2/library/inspect.html#inspect.getsource

26

使用inspect模块:

import inspect
import mymodule
print inspect.getsource(mymodule.sayHello)

这个函数必须在你导入的模块中定义。

撰写回答