inspect.getmembers()和 __dict __.items()和dir()的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (38)

有谁能用足够的例子向我解释一下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
提问于
用户回答回答于

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__是完整的命名空间,包括元类的属性。

扫码关注云+社区