为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕沐林林 2019-11-08 10:39:06
dir(re.compile(pattern)) 不返回pattern作为列表的元素之一。即它返回:['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']根据手册,它应该包含对象的属性名称,其类的属性名称以及递归其类的基类的属性。它也说该列表不一定完整。有没有办法获得完整的清单?我一直以为dir返回一个完整的列表,但显然并没有...另外:有没有办法只列出属性?还是只有方法?编辑:这实际上是python中的错误->据称它已在3.0分支中修复(也许也在2.6中已修复)
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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

对于第二个问题,这没有任何意义。实际上,方法是可调用的属性,仅此而已。但是,您可以过滤可调用的属性,并使用该inspect模块确定类的方法,方法或函数。


查看完整回答
反对 回复 2019-11-08
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

对于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_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__属性。)


查看完整回答
反对 回复 2019-11-08
  • 3 回答
  • 0 关注
  • 596 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信