如何获得对象的方法和属性的完整列表?
dir(re.compile(pattern))
不作为列表元素之一返回模式。 即它返回:
['__copy__', '__deepcopy__', 'findall', 'finditer', 'match', 'scanner', 'search', 'split', 'sub', 'subn']
根据手册,它应该包含
对象的属性名称,类的属性名称和recursion的类的基类的属性。
它也这样说
该列表不一定完整。
有没有办法得到完整的清单? 我总是认为迪尔返回一个完整的列表,但显然它不…
另外:有没有办法只列出属性? 还是只有方法?
编辑:这实际上是一个python的错误 – >据说它是固定在3.0分支(也许还在2.6)
对于完整的属性列表,简短的答案是:不。 问题是这些属性实际上被定义为getattr
内置函数所接受的参数。 由于用户可以重新实现__getattr__
,突然允许任何种类的属性,所以没有可能的通用方法来生成该列表。 dir
函数返回__dict__
属性中的键,即,如果__getattr__
方法未被重新实现,则所有的属性都可以访问。
对于第二个问题,这并不合理。 实际上,方法是可调用的属性,仅此而已。 您可以通过过滤可调用的属性,并使用inspect
模块确定类方法,方法或函数。
这就是为什么新的__dir__()
方法已被添加到Python 2.6
看到:
这里是PierreBdR和Moe答案的实际补充:
– 对于Python> = 2.6 和新风格类 ,dir()似乎已经足够了;
对于旧式的类 ,我们至less可以做一个标准模块来支持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
(为简洁起见,testing代码和输出被删除,但基本上对于新样式的对象,我们似乎对get_object_attrs()
和dir()
具有相同的结果,对于旧样式类, dir()
成为__class__
属性))
这就是我所做的,仅适用于向其添加属性的简单自定义对象:给定使用obj = type("CustomObj",(object,),{})
创build的obj对象,或者简单地:
class CustomObj(object): pass obj=CustomObject()
那么,要获得一个只有自定义属性的字典,我所做的是:
{key: value for key, value in self.__dict__.items() if not key.startswith("__")}