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

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.mrgr.cn/news/58943.html

相关文章:

  • Linux:ELF文件格式和重谈进程地址空间
  • Delphi 7 调用C# 编写的com组件DLL
  • 关于S7_Plus协议的记录
  • Swift 是一种由苹果公司开发的强大而直观的编程语言,主要用于开发 iOS、macOS、watchOS 和 tvOS 等苹果平台的应用程序。
  • 【C++】C++11
  • 前端零基础入门到上班:【Day3】从零开始构建网页骨架HTML
  • 鸿蒙开发初级证书考试答案
  • Uni-App-01
  • 架构师备考专栏-导航页
  • C语言输入输出效率优化
  • layui表格反选功能
  • uniapp:上拉加载更多、下拉刷新、页面滚动到指定位置
  • 力扣33:搜索旋转排序数组
  • 从Docker容器中备份整个PostgreSQL
  • 软考系统分析师知识点二三:错题集1-10
  • 并联谐振回路
  • 无人机原理是什么?
  • Linux下的线程同步与死锁避免
  • 从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架
  • 第15课 算法(上)
  • 快速入门!低功耗4G模组跟服务器之间的加密通信,千万不能错过!
  • 计算机强校99+分《数据库》课设
  • Web开发者必看:TypeScript的进阶用法与最佳实践
  • 动态规划 —— 0-1背包问题
  • vue开发的时候,目录名、文件名、函数名、变量名、数据库字段等命名规范
  • C++11中的同步互斥机制详解