当前位置: 首页 > article >正文

python学习笔记:___getattr__

1、__getattr__:当你访问一个对象的属性,而该属性在对象中不存在时,Python 会调用 __getattr__ 方法。注意,这个方法只会在属性不存在时被调用。

class MyClass:
    def __init__(self):
        self.existing_attribute = "I exist!"
    
    def __getattr__(self, name):
        return f"Attribute '{name}' not found!"

# 创建类的实例
obj = MyClass()

# 访问存在的属性
print(obj.existing_attribute)  # 输出: I exist!

# 访问不存在的属性
print(obj.some_missing_attribute)  # 输出: Attribute 'some_missing_attribute' not found!
 

2、__getattribute__: 无论属性是否存在,都会被调用。通常不建议直接重写,除非你有特殊需求。

class InfiniteLoop:
    def __getattr__(self, name):
        return self.some_missing_attribute  # 这将导致无限递归

当你访问一个对象的属性时,Python 会首先调用 __getattribute__ 方法。

如果 __getattribute__ 没有显式地抛出 AttributeError,则不会调用 __getattr__。

这意味着 __getattribute__ 可以控制所有的属性访问,包括那些存在的属性。

注意事项
1.必须调用 super().__getattribute__: 如果你重写了 __getattribute__,通常需要调用 super().__getattribute__(name) 来实际获取属性的值。否则,你可能无法访问对象的任何属性。


2.性能影响: 因为 __getattribute__ 在每次属性访问时都会被调用,所以不当的实现可能会导致性能问题。


3.避免无限递归: 在 __getattribute__ 中,如果你直接访问对象的属性而不通过 super(),可能会导致无限递归。例如:

class InfiniteLoop:
    def __getattribute__(self, name):
        return self.some_attribute  # 这将导致无限递归
 

class SafeAccess:
    def __getattribute__(self, name):
        return super().__getattribute__(name)
 

4.与 __getattr__ 的区别: __getattribute__ 总是被调用,而 __getattr__ 只有在属性不存在时才被调用。如果你同时定义了这两个方法,__getattribute__ 会优先被调用。

5 高级用法: 由于 __getattribute__ 能够拦截所有的属性访问,它可以用于实现代理模式、跟踪属性访问、调试等高级功能。


http://www.kler.cn/a/369518.html

相关文章:

  • 【51单片机】第一个小程序 —— 点亮LED灯
  • 【CSS3】css开篇基础(4)
  • Elasticsearch 与 Lucene 的区别和联系
  • 关于iPhone 16 Pro评测视频评论区特征的多维度分析
  • Linux - 动静态库
  • 【计网】从零开始认识IP协议 --- 认识网络层,认识IP报头结构
  • Unity 实现音频进度条(可控制)
  • iframe里放的视频,如何采用纯css适配
  • 完美结局 ubuntu开机卡在等待网络连接
  • 【深度学习】合合信息:生成式AI时代的内容安全与系统构建
  • Linux运行时动态库搜索路径优先级
  • 偷懒总结篇|贪心算法|动态规划|单调栈|图论
  • Mqtt协议快速入门Demo
  • RK3568 android11 usb接口TP与电磁笔触点上报优先级问题
  • HCIP-HarmonyOS Application Developer 习题(十八)
  • Unity URP ShaderGraph 基本设置
  • [论文阅读]Detecting Pretraining Data from Large Language Models
  • Windows服务器如何远程登录 #服务器远程教程#
  • 大数据-192 DataX - 异构数据源的同步工具 核心模块 Reader Writer
  • 【微服务】Nacos 注册中心
  • 实时面部情绪识别技术解析
  • 大券商和小券商开户,哪个更划算?
  • 算法:利用前序序列和中序序列构造二叉树
  • Spring常见面试题总结
  • java程序,生成mysql测试数据
  • 高并发-负载均衡