龙空技术网

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

AI自由 144

前言:

如今兄弟们对“javagetset方法什么作用”大体比较关注,大家都想要学习一些“javagetset方法什么作用”的相关资讯。那么小编在网上网罗了一些关于“javagetset方法什么作用””的相关文章,希望你们能喜欢,你们一起来学习一下吧!

在 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)  # 输出: Aliceprint(person.age)   # 输出: 25print(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 = 30print(person.name)  # 输出: Aliceprint(person.age)   # 输出: 30person.age = -5  # 抛出 ValueError: Age cannot be negative

在上面的例子中,当给 person.age 赋值时,__setattr__ 方法被调用,我们可以在这里添加自定义的逻辑。在这个例子中,我们禁止将负数赋给 age 属性,如果赋值为负数,会抛出 ValueError 异常。

总之,__getattr__ __setattr__ 方法提供了一种灵活的方式来自定义属性访问和属性设置的行为,可以根据需要添加额外的逻辑和控制。

标签: #javagetset方法什么作用