如何获得对象的方法和属性的完整列表?

dir(re.compile(pattern)) 

不作为列表元素之一返回模式。 即它返回:

 ['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn'] 

根据手册,它应该包含

对象的属性名称,类的属性名称和recursion的类的基类的属性。

它也这样说

该列表不一定完整。

有没有办法得到完整的清单? 我总是认为迪尔返回一个完整的列表,但显然它不…

另外:有没有办法只列出属性? 还是只有方法?

编辑:这实际上是一个python的错误 – >据说它是固定在3.0分支(也许还在2.6)

对于完整的属性列表,简短的答案是:不。 问题是这些属性实际上被定义为getattr内置函数所接受的参数。 由于用户可以重新实现__getattr__ ,突然允许任何种类的属性,所以没有可能的通用方法来生成该列表。 dir函数返回__dict__属性中的键,即,如果__getattr__方法未被重新实现,则所有的属性都可以访问。

对于第二个问题,这并不合理。 实际上,方法是可调用的属性,仅此而已。 您可以通过过滤可调用的属性,并使用inspect模块确定类方法,方法或函数。

这就是为什么新的__dir__()方法已被添加到Python 2.6

看到:

这里是PierreBdR和Moe答案的实际补充:

– 对于Python> = 2.6 和新风格类 ,dir()似乎已经足够了;
对于旧式的类 ,我们至less可以做一个标准模块来支持tab的完成:除了dir() ,寻找__class__ – 然后去找它的__bases__

 # code borrowed from the rlcompleter module # tested under Python 2.6 ( sys.version = '2.6.5 (r265:79063, Apr 16 2010, 13:09:56) \n[GCC 4.4.3]' ) # or: from rlcompleter import get_class_members def get_class_members(klass): ret = dir(klass) if hasattr(klass,'__bases__'): for base in klass.__bases__: ret = ret + get_class_members(base) return ret def uniq( seq ): """ the 'set()' way ( use dict when there's no set ) """ return list(set(seq)) def get_object_attrs( obj ): # code borrowed from the rlcompleter module ( see the code for Completer::attr_matches() ) ret = dir( obj ) ## if "__builtins__" in ret: ## ret.remove("__builtins__") if hasattr( obj, '__class__'): ret.append('__class__') ret.extend( get_class_members(obj.__class__) ) ret = uniq( ret ) return ret 

(为简洁起见,testing代码和输出被删除,但基本上对于新样式的对象,我们似乎对get_object_attrs()dir()具有相同的结果,对于旧样式类, dir()成为__class__属性))

这就是我所做的,仅适用于向其添加属性的简单自定义对象:给定使用obj = type("CustomObj",(object,),{})创build的obj对象,或者简单地:

 class CustomObj(object): pass obj=CustomObject() 

那么,要获得一个只有自定义属性的字典,我所做的是:

 {key: value for key, value in self.__dict__.items() if not key.startswith("__")}