__setattr__与__setitem__
时间: 2024-11-11 07:30:36 浏览: 19
`__setattr__` 和 `__setitem__` 都是 Python 中用于处理属性访问的特殊方法(也称为魔术方法),但它们适用于不同的场景。
`__setattr__(self, name, value)` 是用于动态属性设置的方法。当你直接通过实例对象使用点(`.`)操作符给对象添加或修改属性时,Python会查找该对象及其元类是否实现了这个方法。如果找到了,它将调用这个方法,而不是像常规那样直接在对象上创建或更新属性。这常用于控制属性的添加、验证或记录。
例如:
```python
class MyObject:
def __setattr__(self, name, value):
if name == 'private':
raise AttributeError("Can't set private attribute")
super().__setattr__(name, value)
obj = MyObject()
obj.public = 'value' # 正常设置
# obj.private = 'value' # 这里会触发异常,因为尝试设置私有属性
```
`__setitem__(self, key, value)` 是针对序列(如列表、元组等)的方法,当你使用索引来赋值时,它会被调用。比如:
```python
class MyList:
def __setitem__(self, index, value):
print(f"Setting item at {index} to {value}")
super().__setitem__(index, value)
my_list = MyList()
my_list[0] = 'hello' # 输出 "Setting item at 0 to hello"
```
这两个方法都是为了提供更精细的控制,尤其是在需要自定义属性行为或序列操作的时候。
阅读全文