如何获取对象的所有方法和属性列表?

252 投票
5 回答
349086 浏览
提问于 2025-04-11 09:24
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模块来确定类的方法、方法或函数。

撰写回答