__dict__ python
时间: 2025-07-01 17:07:00 浏览: 10
在Python中,`__dict__`是一个特殊的属性,用于存储对象或类的可写属性(即实例变量或类变量)。它是一个字典,键是属性名(字符串),值是对应的属性值。`__dict__`提供了动态访问和修改对象属性的能力。
### `__dict__`的常见用途
1. **实例的`__dict__`**:
- 存储实例的属性(动态添加的实例变量)。
- 不包含类属性或方法(除非通过实例动态添加)。
- 示例:
```python
class MyClass:
class_var = "类变量"
def __init__(self, value):
self.instance_var = value
obj = MyClass("实例值")
print(obj.__dict__) # 输出: {'instance_var': '实例值'}
```
2. **类的`__dict__`**:
- 存储类的属性(包括类变量、方法等)。
- 不包含继承的属性(除非显式访问)。
- 示例:
```python
print(MyClass.__dict__)
# 输出可能包含:
# {
# '__module__': '__main__',
# 'class_var': '类变量',
# '__init__': <function MyClass.__init__ at 0x...>,
# '__dict__': <attribute '__dict__' of 'MyClass' objects>,
# ...
# }
```
3. **动态添加/修改属性**:
- 通过`__dict__`可以直接操作属性:
```python
obj.__dict__["new_var"] = "动态添加"
print(obj.new_var) # 输出: "动态添加"
```
### 注意事项
1. **并非所有对象都有`__dict__`**:
- 使用`__slots__`的类实例没有`__dict__`(为了节省内存)。
- 示例:
```python
class SlottedClass:
__slots__ = ['x']
sc = SlottedClass()
sc.x = 10
print(hasattr(sc, '__dict__')) # 输出: False
```
2. **性能优化**:
- 直接访问`__dict__`比通过点号(`.`)访问属性稍慢,因为后者经过优化。
3. **继承关系**:
- 实例的`__dict__`不包含继承的属性,类的`__dict__`也不包含父类的属性(除非用`dir()`或`vars()`)。
### 相关函数
- `vars(obj)`:返回对象的`__dict__`(等价于`obj.__dict__`)。
- `dir(obj)`:返回对象的所有属性(包括继承的,不仅限于`__dict__`)。
### 示例代码
```python
class Person:
species = "人类" # 类变量
def __init__(self, name):
self.name = name # 实例变量
p = Person("Alice")
print(p.__dict__) # 输出: {'name': 'Alice'}
print(Person.__dict__) # 输出类属性和方法
# 动态添加属性
p.__dict__["age"] = 30
print(p.age) # 输出: 30
```
阅读全文
相关推荐


















