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

Jib*_*bin 26 python namespaces

任何人都可以用适当的例子向我解释是否存在差异

>>> import inspect
>>> inspect.getmembers(1)
Run Code Online (Sandbox Code Playgroud)

>>> type(1).__dict__.items()
Run Code Online (Sandbox Code Playgroud)

>>> dir(1)  
Run Code Online (Sandbox Code Playgroud)

除了它们按顺序显示减少数量的属性和方法.1是整数(但它可以是任何类型.)


编辑

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

agf*_*agf 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__']
Run Code Online (Sandbox Code Playgroud)

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