inspect.getmembers()vs __dict __。items()vs dir()

时间:2011-07-20 11:23:35

标签: python namespaces

任何人都可以用适当的例子向我解释一下b / w

的区别
>>> import inspect
>>> inspect.getmembers(1)

>>> type(1).__dict__.items()

>>> dir(1)  

除了他们显示减少的属性数量&按此顺序排列的方法。 1是整数(但它可以是任何类型。)


修改

>>>obj.__class__.__name__  #gives the class name of object  
>>>dir(obj)                #gives attributes & methods  
>>>dir()                   #gives current scope/namespace
>>>obj.__dict__            #gives attributes

1 个答案:

答案 0 :(得分:21)

dir()允许您通过定义__dir__()来自定义对象报告的属性。

从手册中,如果未定义__dir__()

  

如果对象是模块对象,则列表包含模块属性的名称。

     

如果对象是类型或类对象,则列表包含其属性的名称,并且递归地包含其基础的属性。

     

否则,列表包含对象的属性名称,类的属性名称,以及类的基类属性的递归。

这也是inspect.getmembers()返回的内容,除了它返回(name, attribute)的元组而不仅仅是名称。

object.__dict__{key: attribute, key2: atrribute2}等形式的字典

object.__dict__.keys()有其他两个缺乏的东西。

来自inspect.getmembers()上的文档:

  当参数是一个类时,

getmembers()不返回元类属性(此行为继承自dir()函数)。

对于int.__dict__.keys(),这是

['__setattr__', '__reduce_ex__', '__reduce__', '__class__', '__delattr__', '__subclasshook__', '__sizeof__', '__init__']

总结一下,dir()inspect.getmembers()基本相同,而__dict__是包含元类属性的完整命名空间。