如何列出Python类成员函数内的变量?为何dir()无法获取方法局部变量
问题相关示例
示例代码
class hello: cls_var_name='Hello_Class' def setdata(self, value): self.data=value fun1_var_name='Setdata_Function' def showdata(self): fun2_var_name='Showdata_Function' print(self.data)
我们已知借助dir()函数可以列出类的所有属性,但如何列出类的成员函数内部定义的变量/属性呢?
运行演示
>>> dir(hello) ['__doc__', '__module__', 'cls_var_name', 'setdata', 'showdata'] >>> >>> dir(hello.setdata) ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__func__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'im_class', 'im_func', 'im_self'] >>> >>> dir(hello.showdata) ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__', '__format__', '__func__', '__get__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'im_class', 'im_func', 'im_self']
从上述输出可见,dir(hello)的返回结果中列出了类的相关属性:'cls_var_name', 'setdata', 'showdata'
但dir(hello.setdata)和dir(hello.showdata)的返回结果仅列出了方法相关的内置属性,并未包含方法内部定义的fun1_var_name和fun2_var_name变量。
原因解答
- 核心是Python的变量作用域和生命周期规则:
fun1_var_name、fun2_var_name属于函数局部变量,这类变量不会绑定到类、实例或者函数对象本身作为常驻属性存在。它们只有在函数被实际调用执行时,才会在当前函数的栈帧中临时创建,函数运行结束后就会被销毁回收。 dir()函数的作用是查询某个对象当前已经绑定的所有属性和方法。在没有调用对应方法时,这两个局部变量根本还没被创建,自然不会出现在返回结果里。就算你实际调用了方法,这两个变量也只存在于函数运行时的局部作用域中,不会挂载到任何可被dir()遍历的对象上,照样无法通过dir()查到。- 可以对比代码里其他两类能被
dir()查到的变量,和局部变量有本质区别:- 类属性
cls_var_name是在类定义阶段就直接绑定到类对象上的,所以类创建完成后立刻就能通过dir(hello)查到 - 方法内的
self.data=value是显式给实例对象绑定属性,只要调用过一次setdata方法,对应实例上就会存在data属性,可以通过dir(实例对象)查到
- 类属性
- 如果需要在不执行函数的前提下获取函数内部定义的局部变量名,可以访问函数的代码对象属性,比如执行
hello.setdata.__code__.co_varnames,就能拿到该方法的所有局部变量名,包括入参self、value和内部定义的fun1_var_name。注意这个方式只能拿到变量的名称字符串,拿不到实际值——毕竟函数没运行的时候,局部变量根本没有分配实际内存空间,也就不存在具体值。
内容的提问来源于stack exchange,提问作者Rajesh
相关产品推荐
相关产品推荐

