Python中dir()与__dict__的区别详解

林舟
林舟
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python中dir()与__dict__的区别。__dict__仅展示对象自身属性且支持增删改查,而dir()返回包含继承属性的列表,仅用于查看。通过类与实例的对比示例,阐明两者在数据访问与操作上的不同机制,帮助开发者准确使用属性管理工具。

前言

任何具备属性的数据对象(此处指拥有数据类型的数据实体,而非仅限于面向对象中的实例),均可利用__dict__和dir()来查看其相关属性信息。

  • __dict__可视为数据对象的名称空间,它仅包含对象自身的属性,并支持对该字典进行直接的增加、删除、修改和查询操作。
  • dir()则用于展示属性列表,它不仅显示对象自身的属性,还会列出从父类继承而来的属性。

针对模块的情况

具体参考:查看模块属性章节

针对类和对象的情况

通过以下示例,详细说明__dict__和dir()在应用于类和对象时的差异。

class supcls:
 def hello(self):
 self.data1 = 'hello'

class childcls(supcls):
 def world(self):
 self.data2 = "world"

从显示内容的角度来看

  • __dict__是一个字典结构,它仅显示完全属于该对象自身的属性。
  • dir()返回一个列表结构,除了显示对象自身的属性外,还会显示从父类继承的属性,例如从祖先类object继承的属性。

以下是__dict__在类属性上的显示结果。需注意,此处使用keys()仅展示数据对象的属性名称,实际上__dict__中既包含名称,也包含对应的值。

>>> childcls.__dict__.keys()
dict_keys(['__module__', 'world', '__doc__'])

>>> supcls.__dict__.keys()
dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__'])

以下是dir()在显示类属性时的结果:

>>> dir(childcls)
['__class__', '__delattr__', '__dict__',
......
'hello', 'world']

>>> dir(supcls)
['__class__', '__delattr__', '__dict__',
......
'hello']

注意上述dir(childcls)的结果中包含了hello属性,这是来自父类supcls的属性。此外,dir()还显示了大量下划线开头的属性,这些大多继承自祖先类object。

接下来查看类的实例对象的显示结果。

>>> s = supcls()
>>> c = childcls()

>>> s.__dict__.keys()
dict_keys([])

>>> c.__dict__.keys()
dict_keys([])

>>> dir(s)
['__class__', '__delattr__', '__dict__',
......
'hello']

>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'hello', 'world']

设置对象自身的属性后,再次查看:

>>> s.hello()
>>> s.__dict__.keys()
dict_keys(['data1'])

>>> dir(s)
['__class__', '__delattr__', '__dict__',
......
'data1', 'hello']


>>> c.world()
>>> c.__dict__.keys()
dict_keys(['data2'])

>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'data2', 'hello', 'world']

>>> c.hello()
>>> c.__dict__.keys()
dict_keys(['data2', 'data1'])

>>> dir(c)
['__class__', '__delattr__', '__dict__',
......
'data1', 'data2', 'hello', 'world']

从功能作用的角度来看

__dict__是一个字典,它与数据对象的属性直接关联,允许通过__dict__直接访问、设置、修改或删除属性。例如,类的对象实例可以通过self.x=3设置x属性,也可以通过__dict__['x']=3来设置属性x。相比之下,dir()函数仅用于展示部分属性信息。

例如:

>>> c.__dict__['newkey']="NEWKEY"
>>> c.__dict__.keys()
dict_keys(['data2', 'data1', 'newkey'])

上述代码通过__dict__设置了一个新属性newkey,此时newkey已成为对象c的一个实例属性。上述设置方式与c.newkey="NEWKEY"是等价的。

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对本站的支持。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。