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

dir(re.compile(pattern)) 

不返回pattern作为列表的元素之一。即它返回:


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

根据手册,它应该包含


对象的属性名称,其类的属性名称以及递归其类的基类的属性。


它也说


该列表不一定完整。


有没有办法获得完整的清单?我一直以为dir返回一个完整的列表,但显然并没有...


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


编辑:这实际上是python中的错误->据称它已在3.0分支中修复(也许也在2.6中已修复)


慕沐林林
浏览 607回答 3
3回答

一只萌萌小番薯

对于属性的完整列表,简短的答案是:否。问题在于属性实际上定义为getattr内置函数接受的参数。由于用户可以重新实现__getattr__,突然允许任何类型的属性,因此没有可能的通用方法来生成该列表。该dir函数返回__dict__属性中的键,即,如果__getattr__未重新实现该方法,则所有可访问的属性。对于第二个问题,这没有任何意义。实际上,方法是可调用的属性,仅此而已。但是,您可以过滤可调用的属性,并使用该inspect模块确定类的方法,方法或函数。

蛊毒传说

对于Python> = 2.6和新型类,dir()似乎就足够了。对于老式类,我们至少可以做一个标准模块来支持制表符补全:除了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_membersdef get_class_members(klass):    ret = dir(klass)    if hasattr(klass,'__bases__'):        for base in klass.__bases__:            ret = ret + get_class_members(base)    return retdef 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__属性。)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python