inspect.getmembers() 与 __dict__.items() 与 dir() 的区别

33 投票
1 回答
9074 浏览
提问于 2025-04-16 21:55

有没有人能给我解释一下这几个东西之间的区别,并举一些例子?

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

撰写回答