专业编程基础技术教程

网站首页 > 基础教程 正文

python 中`__getattr__` 和 `__setattr__`有什么用?

ccvgpt 2024-08-05 12:13:04 基础教程 10 ℃

在 Python 中,__getattr__ __setattr__ 是特殊方法(也称为魔术方法或魔法方法),用于自定义属性访问和属性设置的行为。它们允许我们在对象访问和修改属性时插入自定义的逻辑。以下是它们的作用和示例说明:

__getattr__ 方法:

python 中`__getattr__` 和 `__setattr__`有什么用?

  • 作用:当访问一个对象不存在的属性时触发,可以用来动态计算属性或提供默认值。
  • 示例:
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__ 方法提供了一种灵活的方式来自定义属性访问和属性设置的行为,可以根据需要添加额外的逻辑和控制。

Tags:

最近发表
标签列表