inspect.getmembers() 与 __dict__.items() 与 dir() 的区别
有没有人能给我解释一下这几个东西之间的区别,并举一些例子?
>>> import inspect
>>> inspect.getmembers(1)
和
>>> type(1).__dict__.items()
还有
>>> dir(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 个回答
25
dir()
这个函数可以让你自定义你的对象报告哪些属性,这个通过定义 __dir__()
来实现。
根据手册,如果没有定义 __dir__()
:
如果这个对象是一个模块对象,那么列表里会包含这个模块的属性名称。
如果这个对象是一个类型或类对象,那么列表里会包含它的属性名称,以及它的父类属性的名称。
如果不是以上两种情况,列表里会包含这个对象的属性名称、它的类的属性名称,以及它的类的父类属性名称。
这也是 inspect.getmembers()
返回的内容,只不过它返回的是 (名称, 属性)
的元组,而不仅仅是名称。
object.__dict__
是一个字典,格式是 {key: 属性, key2: 属性2}
等等。
object.__dict__.keys()
包含了前面两个方法所缺少的内容。
根据 inspect.getmembers()
的文档:
当参数是一个类时,getmembers() 不会返回类的元类属性(这个行为是从
dir()
函数继承来的)。
对于 int.__dict__.keys()
,结果是
['__setattr__', '__reduce_ex__', '__reduce__', '__class__', '__delattr__', '__subclasshook__', '__sizeof__', '__init__']
总的来说,dir()
和 inspect.getmembers()
基本上是一样的,而 __dict__
是包含元类属性的完整命名空间。