### 基于Python `__dict__` 与 `dir()` 的区别详解 在Python编程语言中,一切皆对象的概念非常关键。对于每个对象来说,它们都有多个属性(attributes),而Python提供了一套完整的机制来管理和访问这些属性。本文将详细介绍Python中用于访问对象属性的两种方法:`__dict__` 和 `dir()` 函数,并探讨它们之间的主要差异。 #### 一、`__dict__` 属性 `__dict__` 是一个内置的属性,它是一个字典,其中包含了对象的所有可变属性及其对应的值。`__dict__` 通常用于存储实例变量,即那些在创建对象时可以设置或更改的属性。 **特点:** - `__dict__` 是一个字典,键为属性名,值为属性的值。 - 并不是所有的对象都拥有 `__dict__` 属性。例如,像列表(list)、元组(tuple)这样的内置类型就没有 `__dict__` 属性。 - 对于类的实例而言,`__dict__` 存储了该实例特有的属性和值。 **示例代码:** ```python class A(object): class_var = 1 def __init__(self): self.name = 'xy' self.age = 2 @property def num(self): return self.age + 10 def fun(self): pass @staticmethod def static_f(): pass @classmethod def class_f(cls): pass if __name__ == '__main__': a = A() print(a.__dict__) # 输出 {'age': 2, 'name': 'xy'} a.level1 = 3 a.fun = lambda x: x print(a.__dict__) # 输出 {'level1': 3, 'age': 2, 'name': 'xy', 'fun': <function <lambda> at 0x>} A.level2 = 4 print(a.__dict__) # 输出 {'level1': 3, 'age': 2, 'name': 'xy'} ``` **解释:** - 实例 `a` 的 `__dict__` 仅包含与该实例相关的实例属性(`age`, `name`, `level1` 和 `fun`)。 - 类 `A` 的 `__dict__` 包含了类的属性和方法,但不包含父类的属性。 #### 二、`dir()` 函数 `dir()` 是Python内置的一个函数,它返回一个包含指定对象的所有属性名称的列表。这些属性包括对象自身的属性以及从其父类继承来的属性。 **特点:** - `dir()` 返回一个列表,包含了对象的所有属性名。 - `dir()` 可以列出对象的所有属性,包括 `__dict__` 中的属性。 - 即使某些对象没有 `__dict__` 属性,`dir()` 也可以列出这些对象的有效属性。 **示例代码:** ```python if __name__ == '__main__': print(dir(A)) ``` **输出示例:** ```python ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', ...] ``` **解释:** - `dir(A)` 列出了类 `A` 的所有属性,包括那些通过继承获得的属性。 #### 三、`__dict__` 与 `dir()` 的区别 - **类型差异:** `__dict__` 是一个字典,而 `dir()` 返回的是一个列表。 - **包含内容差异:** `__dict__` 只包含对象自身定义的属性;`dir()` 则包含对象本身以及其父类的属性。 - **适用对象差异:** 并非所有对象都有 `__dict__` 属性,但对于任何对象都可以调用 `dir()` 来获取其所有属性。 在处理对象属性时,选择使用 `__dict__` 还是 `dir()` 主要取决于具体的需求。如果只需要查看或操作特定对象的实例属性,则使用 `__dict__` 更合适;如果需要获取对象的所有属性(包括继承自父类的属性),则应使用 `dir()`。
- 粉丝: 11
- 资源: 884
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助