2011-08-18 51 views
2

美好的一天!如何在不实例化类的情况下获得类成员的完整列表?

我在写一个为我的数据感知应用程序构建GUI的小工具。

的基本思想是得到一个模块含有一个模型描述(sqla/elixir实体)作为输入,并用可用类从该列表(从Entity()继承)和它们的字段(从Field()继承)向用户呈现模块。

pyclbr模块很适合获取类和它们的方法,但它不能读取其他类成员。我知道关于__dict__检查模块,但问题是他们需要实例化一个类的问题,这是在这种情况下是错误的。那么,还有另一种方式吗?

我真的不想将模块解析为文本。 :)

回答

5

我不知道我知道你的意思:

class a(object): 
    b = 'a' 
    c = 'd' 

print dir(a) 

打印

['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'b', 'c'] 

您可以使用

print [i for i in dir(a) if not i.endswith('__')] 

,如果你不希望看到的特殊的方法。

你不需要实例化类来查看它的成员。你不会看到在方法内部添加的属性,但是在类定义或元类的方法中定义的所有东西都会在那里。

请参阅我对inspect.getmembers() vs __dict__.items() vs dir()的回答,以获取有关这些不同功能返回的更多信息。

+0

在您的示例中,dir在模块的上下文中调用。这意味着我必须先导入模块,对吗? – AlexVhr

+0

只要使用'mod = __import __('modname')',如果你不想在当前上下文中使用。然后你可以使用'dir(modname)'来获取它的属性,然后从那里开始工作。如果模块在导入时运行代码而不想运行,它应该放在'if __name__ ='__main __''或一个'run()'函数中。 – agf

+0

感谢提示,我可能会这样。在我的情况下,没有任何保证源模块不会包含任何运行导入代码,但我想我必须忍受它。谢谢! – AlexVhr

相关问题