龙空技术网

python 中__getattr__ 和 __getattribute__ 有什么用

AI自由 184

前言:

现时姐妹们对“python中get”都比较注意,姐妹们都想要分析一些“python中get”的相关文章。那么小编也在网摘上搜集了一些对于“python中get””的相关内容,希望同学们能喜欢,我们快快来学习一下吧!

在Python中,__getattr____getattribute__都是特殊方法,用于访问对象的属性。它们的作用和行为略有不同,具体如下:

__getattr__方法:当访问一个对象的不存在的属性时触发。可以用于在属性不存在时提供默认值或执行一些动态逻辑。只在属性不存在时被调用,而对于已存在的属性访问不会触发。需要返回属性值或引发AttributeError异常。

以下是一个示例,演示了__getattr__方法的使用:

class Person:    def __getattr__(self, name):        if name == 'age':            return 25        else:            raise AttributeError(f"'Person' object has no attribute '{name}'")person = Person()print(person.age)   # 输出: 25print(person.name)  # 引发AttributeError异常

在上述示例中,Person类定义了__getattr__方法。当访问对象的age属性时,由于age属性不存在,__getattr__方法被调用,并返回默认值25。当访问对象的name属性时,name属性同样不存在,__getattr__方法引发AttributeError异常。

__getattribute__方法:在访问一个对象的任何属性时都会触发。可以用于拦截属性访问并执行一些自定义逻辑。需要谨慎使用,因为它会拦截所有属性的访问,包括已存在的属性。需要注意避免无限递归调用,因为在__getattribute__方法中访问属性可能会再次触发该方法。

以下是一个示例,演示了__getattribute__方法的使用:

class Person:    def __init__(self, name, age):        self.name = name        self.age = age    def __getattribute__(self, name):        print(f"Accessing attribute: {name}")        return object.__getattribute__(self, name)person = Person('Alice', 25)print(person.name)  # 输出: "Accessing attribute: name" 和 "Alice"print(person.age)   # 输出: "Accessing attribute: age" 和 25

在上述示例中,Person类定义了__getattribute__方法。当访问对象的任何属性时,__getattribute__方法被调用并打印出访问的属性名称,然后返回属性的值。

区别和联系:主要区别在于触发时机:__getattr__在访问不存在的属性时触发,而__getattribute__在访问任何属性时都触发。__getattr__是在属性不存在时提供默认值或执行动态逻辑,而__getattribute__可以用于拦截属性访问并执行自定义逻辑。

标签: #python中get