在 Python 中,__getattr__ 和 __setattr__ 是特殊方法(也称为魔术方法或魔法方法),用于自定义属性访问和属性设置的行为。它们允许我们在对象访问和修改属性时插入自定义的逻辑。以下是它们的作用和示例说明:
__getattr__ 方法:
- 作用:当访问一个对象不存在的属性时触发,可以用来动态计算属性或提供默认值。
- 示例:
class Person:
def __init__(self, name):
self.name = name
def __getattr__(self, attr):
if attr == 'age':
return 25
else:
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{attr}'")
person = Person('Alice')
print(person.name) # 输出: Alice
print(person.age) # 输出: 25
print(person.gender) # 抛出 AttributeError: 'Person' object has no attribute 'gender'
在上面的例子中,当访问 person.age 时,由于 age 属性并不存在,__getattr__ 方法被调用,返回了默认的年龄值 25。当访问 person.gender 时,由于该属性也不存在,__getattr__ 方法会抛出 AttributeError 异常。
__setattr__ 方法:
- 作用:在给对象的属性赋值时触发,可以用来控制属性赋值的逻辑。
- 示例:
class Person:
def __setattr__(self, attr, value):
if attr == 'age' and value < 0:
raise ValueError("Age cannot be negative")
else:
super().__setattr__(attr, value)
person = Person()
person.name = 'Alice'
person.age = 30
print(person.name) # 输出: Alice
print(person.age) # 输出: 30
person.age = -5 # 抛出 ValueError: Age cannot be negative
在上面的例子中,当给 person.age 赋值时,__setattr__ 方法被调用,我们可以在这里添加自定义的逻辑。在这个例子中,我们禁止将负数赋给 age 属性,如果赋值为负数,会抛出 ValueError 异常。
总之,__getattr__ 和 __setattr__ 方法提供了一种灵活的方式来自定义属性访问和属性设置的行为,可以根据需要添加额外的逻辑和控制。