当前位置: 首页 > 面试题库 >

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

丌官信厚
2023-03-14
问题内容

任何人都可以通过适当的例子向我解释一下黑白之间有什么区别

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



 类似资料:
  • 爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供 Item 类来满足这样的需求。 Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。 声明Item Item使用简单的class定义语法以及 Field 对象来声明。例如: import scrapy class Pro

  • Use Cases Create a shortcut for an action or a series of actions that the user repeatedly does. Create a button for custom behavior. How to create custom menu items The methods for adding custom menu

  • Memcached stats items 命令用于显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。 语法: stats items 命令的基本语法格式如下: 实例

  • New in version 0.5. There are two additional directives when using this extension: .. todo:: Use this directive like, for example, note. It will only show up in the output if :confval:`todo_include_to

  • Module author: Daniel Bültmann New in version 0.5. There are two additional directives when using this extension: .. todo:: Use this directive like, for example, note. It will only show up in the outp

  • 概要 形式 1: <#list sequence as item> Part repeated for each item <#else> Part executed when there are 0 items </#list> 这里: else 部分是可选的, 而且仅仅从 FreeMarker 2.3.23 版本开始支持。 sequence: 将我们想要迭代的项,算作是序列或集