如何列出类函数内的变量或属性?

Raj*_*esh 2 python

示例代码:

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)
Run Code Online (Sandbox Code Playgroud)

因此,借助该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']
Run Code Online (Sandbox Code Playgroud)

在上面的输出中,您可以在结果中看到类的属性列表dir(hello)'cls_var_name', 'setdata', 'showdata'

但是对于dir(hello.setdata)and dir(hello.showdata)result,它列出了所有相关的属性,但没有列出fun1_var_nameandfun2_var_name变量,为什么?

Ale*_*der 6

原因是该dir函数显示绑定到对象的属性和属性的列表。fun_var_name不是setdata方法的属性,它是一个存在于方法体范围内的变量,一旦退出就被丢弃。

因此,当您调用时,dir(hello.showdata)除非在方法内部进行调用showdatafunc2_var_name否则该变量不存在,但即使存在,该变量仍然不会使用该dir函数出现,因为它未绑定到可调用方法对象。(“可调用方法对象”只是方法的另一个术语,但它强调了这样一个事实:方法,就像 Python 中的几乎所有内容一样,也是对象。)

如果您想要的是访问变量名称列表的方法,您可以使用该vars()函数,但它只会显示已定义且在当前范围内的变量。像这样:

class hello:
    cls_var_name='Hello_Class'

    def setdata(self, value):
        self.data=value
        fun1_var_name='Setdata_Function'
        print(vars())

    def showdata(self):
        fun2_var_name='Showdata_Function'
        print(self.data)
        print(vars())
Run Code Online (Sandbox Code Playgroud)

从方法体外部获取变量名称是不可能的,因为这些变量不存在。

可以使用该inspect模块并获取实际的源代码,但我认为这不是您想要的。