打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
python 中__getattr__ 和 __getattribute__ 有什么用
userphoto

2023.07.29 浙江

关注

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

  1. __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异常。

  1. __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__可以用于拦截属性访问并执行自定义逻辑。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
打破疑惑:一次搞懂hasattr()、getattr()、setattr()在Python中的应用
解密 __getattr__ 和 __getattribute__ 的用法与区别
python笔记61 - __getattr__ 属性查找学习与使用
技术图文:Python魔法方法之属性访问详解
python attribute lookup
[python] 类常用的内置方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服