如何获取类

时间:2016-12-13 06:50:38

标签: python class variables methods abstract-syntax-tree

我有以下课程:

class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = something
    def bar(self):
        var3 = some value
    def baz(self, var):
        var4 = some value

我想打印方法中定义的所有变量的名称,例如:

setUp, bar, baz, var1, var2, var3, var4

我尝试使用locals(), vars(), globals(),但我只获取方法的名称,而不是变量名。

我也尝试使用ast模块,但没有成功。

3 个答案:

答案 0 :(得分:2)

class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = "something"
    def bar(self):
        var3 = "some value"
    def baz(self, var):
        var5 = 34


print Foo.setUp.__code__.co_varnames
print Foo.bar.__code__.co_varnames
print Foo.baz.__code__.co_varnames
Output:
('self',)
('self', 'var3')
('self', 'var', 'var5')

答案 1 :(得分:1)

您可以使用ast.parse生成AST节点。然后ast.walk可用于递归迭代节点及其`后代。对于每个节点,您可以检查类型,然后提取正确的属性。

下面是一个使用您的代码的示例,但不希望它与更复杂的文件一起工作:

source = '''
class Foo(object):
    def setUp(self):
        self.var1 = "some value"
        self.var2 = 1
    def bar(self):
        var3 = 2
    def baz(self, var):
        var4 = var
'''

import ast

def hack(source):
    root = ast.parse(source)

    for node in ast.walk(root):
        if isinstance(node, ast.Name) and isinstance(node.ctx, ast.Store):
            yield node.id
        elif isinstance(node, ast.Attribute):
            yield node.attr
        elif isinstance(node, ast.FunctionDef):
            yield node.name

print(list(hack(source)))

输出:

['setUp', 'bar', 'baz', 'var1', 'var2', 'var3', 'var4']

答案 2 :(得分:0)

尚无评论(信誉不足),但这看起来像是Iterate over object attributes in python的副本。

试试这个:

print([a for a in dir(obj) if not a.startswith('__') and not callable(getattr(obj,a))])