dir(re.compile(pattern))
不会将模式作为列表元素之一返回。即它返回:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
根据手册,它应该包含
对象的属性名称, 它的类的属性的名称,和 递归地说它的属性 class的基类。
它也说
列表不一定完整。
有没有办法获得完整列表?我总是认为dir会返回一个完整的列表,但显然它没有......
另外:有没有办法只列出属性?或者只有方法?
编辑:这实际上是python中的一个错误 - >据说它在3.0分支中固定(也可能在2.6中)
答案 0 :(得分:135)
对于完整属性列表,简短回答是:no。问题是属性实际上被定义为getattr
内置函数接受的参数。由于用户可以重新实现__getattr__
,突然允许任何类型的属性,因此没有可能的通用方法来生成该列表。 dir
函数返回__dict__
属性中的键,即如果__getattr__
方法未重新实现,则可访问所有属性。
对于第二个问题,它确实没有意义。实际上,方法是可调用的属性,仅此而已。您可以过滤可调用属性,并使用inspect
模块确定类方法,方法或函数。
答案 1 :(得分:53)
这就是为什么在python 2.6中添加了新的__dir__()
方法
请参阅:
答案 2 :(得分:19)
以下是PierreBdR和Moe答案的实用补充:
dir()
似乎已足够。对于旧式类,我们至少可以执行standard module支持标签完成的操作:除了dir()
之外,还要查找{{ 1}},然后转到__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()
属性。)
答案 3 :(得分:7)
仅用于补充:
dir()
是最功能强大/基本的工具。 (最推荐)除dir()
以外的解决方案仅提供他们的方式来处理 dir()
的输出。
是否列出第二级属性,必须自己进行筛选,这很重要,因为有时您可能希望筛选带有前划线({1))的内部变量,但是有时您很需要{{1} }文档字符串。
__
和__doc__
返回相同的内容。__dir__()
和dir()
不同。 __dict__
返回的内容不完整。 重要:dir()
有时可以被作者出于任何目的用函数,值或类型覆盖。
这里是一个例子:
__dict__
TypeError:__dir__()
对象的描述符\\...\\torchfun.py in traverse(self, mod, search_attributes)
445 if prefix in traversed_mod_names:
446 continue
447 names = dir(m)
448 for name in names:
449 obj = getattr(m,name)
需要一个参数
PyTorch的作者将__dir__
方法修改为需要参数的方法。此修改使'object'
失败。
如果您要使用可靠方案来遍历对象的所有属性,请记住,每个pythonic标准都可以被覆盖并且可能不成立,并且每个约定可能不可靠。
答案 4 :(得分:4)
这就是我这样做的方法,对于你不断添加属性的简单自定义对象非常有用:
给定使用obj = type("Obj",(object,),{})
创建的对象,或简单地:
class Obj: pass
obj = Obj()
添加一些属性:
obj.name = 'gary'
obj.age = 32
然后,获取仅包含自定义属性的字典:
{key: value for key, value in obj.__dict__.items() if not key.startswith("__")}
# {'name': 'gary', 'age': 32}