如何获取对象的所有方法和属性列表?
dir(re.compile(pattern))
这个方法并不会把模式作为列表中的一个元素返回。实际上,它返回的是:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
根据手册,它应该包含
对象的属性名称、它所在类的属性名称,以及 递归地包含它的基类的属性名称。
手册中还提到
这个列表不一定是完整的。
有没有办法获取一个完整的列表?我一直以为 dir 方法会返回一个完整的列表,但显然并不是这样……
另外,有没有办法只列出属性?或者只列出方法?
编辑:这实际上是 Python 的一个 bug -> 据说在 3.0 版本中修复了这个问题(也可能在 2.6 中修复了)
5 个回答
22
这里有个实用的补充,针对PierreBdR和Moe的回答:
- 对于Python版本大于等于2.6的新式类,使用
dir()
就足够了。 对于旧式类,我们至少可以做一些事情,像一个标准模块那样来支持按下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
(为了简洁,测试代码和输出被省略了,但基本上对于新式对象,get_object_attrs()
的结果和dir()
是一样的,而对于旧式类,dir()
输出的主要新增内容是__class__
属性。)
61
这就是为什么在Python 2.6中新增了一个叫做 __dir__()
的方法。
你可以查看:
149
关于完整的属性列表,简单来说就是:没有。问题在于,这些属性实际上是作为参数定义在内置函数getattr
中的。因为用户可以重新实现__getattr__
,这就意味着可以随意添加各种属性,所以没有一种通用的方法可以生成这个列表。dir
函数返回的是__dict__
属性中的键,也就是在没有重新实现__getattr__
方法的情况下,所有可以访问的属性。
至于第二个问题,其实没有什么意义。实际上,方法就是可调用的属性,仅此而已。不过,你可以过滤出可调用的属性,然后使用inspect
模块来确定类的方法、方法或函数。