python class __getattr__ 与 __getattribute__ 的区别
在Python中,__getattr__是一个特殊的方法,用于处理访问不存在的属性时的行为。它通常在类中被重写,以便在属性访问失败时提供自定义的处理逻辑。
__getattr__ 的使用
1. 基本用法
__getattr__方法在访问类实例的某个不存在的属性时自动调用。其签名如下:
def __getattr__(self, name):# 自定义处理逻辑pass
self:指向实例对象本身。name:要访问的不存在的属性的名称。
2. 示例
以下是一个简单的示例,展示如何使用__getattr__:
class MyClass:def __init__(self, existing_attribute):self.existing_attribute = existing_attributedef __getattr__(self, name):return f"The attribute '{name}' does not exist"# 创建对象
obj = MyClass("Hello")# 访问存在的属性
print(obj.existing_attribute) # 输出: Hello# 访问不存在的属性
print(obj.non_existent_attribute) # 输出: The attribute 'non_existent_attribute' does not exist
3. 实现动态属性
可以使用__getattr__来实现动态属性:
class DynamicAttributes:def __init__(self, base_value):self.base_value = base_valuedef __getattr__(self, name):if name.startswith("dynamic_"):return f"Dynamic value based on {self.base_value} and {name}"raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")# 创建对象
obj = DynamicAttributes(10)# 访问动态属性
print(obj.dynamic_example) # 输出: Dynamic value based on 10 and dynamic_example# 访问不存在的普通属性会引发 AttributeError
print(obj.some_other_attribute) # 输出: AttributeError: 'DynamicAttributes' object has no attribute 'some_other_attribute'
__getattr__ 与 __getattribute__ 的区别
__getattr__:仅在访问不存在的属性时调用。__getattribute__:每次访问属性时都会调用,不论该属性是否存在。因此,如果使用__getattribute__,必须特别小心以避免无限递归。
__getattribute__ 示例
class MyClass:def __init__(self, value):self.value = valuedef __getattribute__(self, name):print(f"Accessing attribute: {name}")return super().__getattribute__(name)# 创建对象
obj = MyClass(100)# 访问属性
print(obj.value) # 输出: Accessing attribute: value\n100
典型应用场景
-
延迟加载属性:当某些属性的计算开销较大且可能并不总是需要时,可以使用
__getattr__在第一次访问时计算并缓存这些属性。 -
代理模式:在代理对象中,将对不存在属性的访问转发到实际对象。
class RealObject:def __init__(self):self.existing_attribute = "I'm real"class Proxy:def __init__(self, real_object):self._real_object = real_objectdef __getattr__(self, name):return getattr(self._real_object, name)# 创建真实对象和代理对象
real = RealObject()
proxy = Proxy(real)# 通过代理对象访问真实对象的属性
print(proxy.existing_attribute) # 输出: I'm real
- 配置管理:在动态生成配置项时,可以通过
__getattr__来实现。
class Config:def __init__(self, settings):self._settings = settingsdef __getattr__(self, name):return self._settings.get(name, None)# 创建配置对象
settings = {'host': 'localhost', 'port': 8080}
config = Config(settings)# 访问配置项
print(config.host) # 输出: localhost
print(config.port) # 输出: 8080
print(config.debug) # 输出: None
通过__getattr__,可以使类的属性访问更加灵活,满足特定需求。合理使用这个方法可以增强代码的动态性和适应性,但滥用可能导致代码难以调试和维护。
相关文章:
python class __getattr__ 与 __getattribute__ 的区别
在Python中,__getattr__是一个特殊的方法,用于处理访问不存在的属性时的行为。它通常在类中被重写,以便在属性访问失败时提供自定义的处理逻辑。 __getattr__ 的使用 1. 基本用法 __getattr__方法在访问类实例的某个不存在的属性时自动调用…...
[ C++ ] 类和对象( 下 )
初始化列表 初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _d…...
这么多不同接口的固态硬盘,你选对了嘛!
固态硬盘大家都不陌生,玩游戏、办公存储都会用到。如果自己想要给电脑或笔记本升级下存储,想要存储更多的文件,该怎么选购不同类型的SSD固态盘呐,下面就来认识下日常使用中常见的固态硬盘。 固态硬盘(Solid State Drive, SSD)作为数据存储技术的革新力量,其接口类型的选…...
使用IDEA远程debug调试
文章目录 应用背景开启方式IDEA设置启动脚本改造 参考资料 应用背景 springboot项目,部署到服务器上,需要开启远程debug跟踪代码。 使用idea开启远程debug。 开启方式 IDEA设置 选择 Edit Configuration 如图,点击加号,选择Re…...
开源自定义表单系统源码 一键生成表单工具 可自由DIY表单模型+二开
分享一款开源自定义表单系统源码,能够实现99%各行业的报名、预约、加盟申请、调查等应用,而且同时多开创建多个表单,支持自定义各种字段模型,市面上需要的表单模型都含了,随便自定义啦,含完整的代码包和详细…...
【java10】集合中新增copyof创建只读集合
在Java中,集合(如List、Set、Map等)是编程中常用的数据结构。然而,在某些场景下,我们可能希望集合中的数据是只读的,即不允许修改集合中的元素。在Java8及之前,要实现这样的功能,我们…...
python小甲鱼作业001-3讲
0.Python是什么类型的语言 编译型语言不同,Python 代码在执行时由解释器直接逐行解释执行,无需先编译成机器语言。这使得开发过程更快,因为你可以即时运行并测试你的代码。 Python 在运行时自动推断变量的类型,无需在代码中显式声…...
做电商,错过了2020年的抖音!那2024一定要选择视频号小店!
哈喽~我是电商月月 电商老板们集合了,问大家一个问题: 如果能让你回到三四年前,抖音才步入大众视野,这时候让你去做抖音小店,你愿意吗? 我敢相信!很多,错过当年抖音红利的商家,一…...
赛氪网与武汉外语外事职业学院签署校企合作,共创职业教育新篇章
5月23日下午14:00,武汉外语外事职业学院在藏龙岛校区食堂三楼报告厅隆重举行了2024年职业教育活动周优秀校外实习基地表彰仪式。本次活动旨在表彰在职业教育领域作出突出贡献的校外实习基地,同时加强校企合作,共同推动职业教育的发展。作为重…...
如何在文档中有效添加网格:技巧与实例
新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:为何添加网格至关重要 二、网格添加的基本步骤 1. 确定网格类型和样式…...
设计模式10——装饰模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 装饰模式 是一种结构型模式。…...
如果返回的json 中有 ‘///’ 转换
// 将返回数据的三条/和替换空 rowData.Jsonobj rowData.Jsonobj .replace(/^\s*\/\/\/.*$/gm, //); // 将返回的替换成" 并且外面加个"" rowData.Jsonobj "${rowData.Jsonobj .replace(//g, ")}"; // 转换回来数据用两个 JSON.parse(JSON.par…...
JAVA学习-练习试用Java实现“多线程问题”
问题: 1.程序中需要开启两个线程(线程1和线程2) 2.线程1固定5秒钟执行一次 3.线程2固定10秒钟执行一次 4.开启程序如何做到线程1执行完成后再执行线程2并且在之后无论谁先执行都需等待对方执行完成后才可以开始执行 解答思路: 要实现线程 1 执行完成…...
SQOOP详细讲解
SQOOP安装及使用 SQOOP安装及使用SQOOP安装1、上传并解压2、修改文件夹名字3、修改配置文件4、修改环境变量5、添加MySQL连接驱动6、测试准备MySQL数据登录MySQL数据库创建student数据库切换数据库并导入数据另外一种导入数据的方式使用Navicat运行SQL文件导出MySQL数据库impo…...
【Unity入门】认识Unity编辑器
Unity 是一个广泛应用于游戏开发的强大引擎,从 1.0 版本开始到现在,其编辑器的基本框架一直保持稳定。其基于组件架构的设计,使得界面使用起来直观且高效。为了更好地理解 Unity 的界面,我们可以将其比喻为搭建一个舞台。以下是对…...
Spring控制重复请求
通过AOP拦截所有请求,控制在规定时间内请求次数。 1:添加maven <dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</version> </dependency> 2&#x…...
AWS安全性身份和合规性之Key Management Service(KMS)
AWS Key Management Service(KMS)是一项用于创建和管理加密密钥的托管服务,可帮助客户保护其数据的安全性和机密性。 比如一家医疗保健公司需要在AWS上存储敏感的病人健康数据,需要对数据进行加密以确保数据的机密性。他们使用AW…...
esp32 固件备份 固件恢复
首先是固件备份,这个在产品的工程管理中还是相当重要的。由于工具链的更新(工具版本),以及板子或其上物料的变更(硬件版本),或者新的库的导入或原有库的删除,PCBA是分分钟有可能死给…...
linux开发之设备树四、设备树中断节点
中断节点 这里是由原厂的BSP工程师写的一部分 在CPU的外部有一个GIC控制器,外设会连接在GIC控制器上 设备树是对硬件进行描述的,所以设备树会对CPU进行描述,也要对GIC 控制器进行描述,这部分的代码由原厂的BSP工程师进行编写&…...
基于STM32实现智能楼宇对讲系统
目录 引言环境准备智能楼宇对讲系统基础代码示例:实现智能楼宇对讲系统 音频输入和输出按键控制显示屏和用户界面网络通信应用场景:楼宇安防与智能家居问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智能…...
一丹一世界FLUX.1部署教程:防火墙开放7861端口+nginx反向代理+HTTPS安全加固
一丹一世界FLUX.1部署教程:防火墙开放7861端口nginx反向代理HTTPS安全加固 1. 引言:从本地服务到安全可靠的在线AI画板 你可能已经体验过在本地服务器上运行“一丹一世界”FLUX.1 AI图像生成服务,通过http://你的IP:7861访问那个简洁的界面…...
告别串口调试助手:用Chrome浏览器直接调试Arduino/ESP32(Web Serial API实战)
浏览器直连硬件:Web Serial API在物联网开发中的高阶应用 每次调试Arduino或ESP32设备时,那些繁琐的串口助手切换、驱动安装和兼容性问题是否让您感到疲惫?现在,只需一个Chrome浏览器窗口,就能完成从设备连接到数据可…...
SenseVoice-small部署教程:国产昇腾AI芯片Ascend CANN适配进展
SenseVoice-small部署教程:国产昇腾AI芯片Ascend CANN适配进展 1. 引言:当语音识别遇上国产算力 想象一下,你正在开发一款面向医疗场景的离线语音助手,需要实时将医生的口述病历转成文字。数据隐私要求极高,不能上传…...
用OB_Template实现笔记高效管理与知识沉淀:从入门到精通
用OB_Template实现笔记高效管理与知识沉淀:从入门到精通 【免费下载链接】OB_Template OB_Templates is a Obsidian reference for note templates focused on new users of the application using only core plugins. 项目地址: https://gitcode.com/gh_mirrors/…...
开源视频编辑解决方案:从零构建专业级Web视频编辑器OpenCut
开源视频编辑解决方案:从零构建专业级Web视频编辑器OpenCut 【免费下载链接】OpenCut The open-source CapCut alternative 项目地址: https://gitcode.com/gh_mirrors/ap/OpenCut 在数字内容创作爆炸的时代,视频编辑工具的选择直接影响创作效率与…...
终极指南:OpenAI Python SDK推理强度参数调优实战
终极指南:OpenAI Python SDK推理强度参数调优实战 【免费下载链接】openai-python The official Python library for the OpenAI API 项目地址: https://gitcode.com/GitHub_Trending/op/openai-python 掌握OpenAI Python SDK推理强度参数配置,让…...
C# rtwpriv Wi-Fi定频工具
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、使用简介,说明#前言 对于无线产品,很多需要做CE,FCC,SRRC等认证,需要测试RF,像Realtek方案的Wi-Fi用到rtwpriv工具…...
CentOS7服务器流量飙升?别慌,用iftop+nload快速揪出‘吃流量’的进程
CentOS7服务器流量异常排查实战:iftop与nload组合拳 深夜的告警铃声突然响起,监控系统显示某台核心业务服务器的带宽使用率飙升至95%。作为运维人员,这种场景并不陌生——可能是业务量激增,也可能是恶意攻击,或是某个失…...
MiniCPM-o-4.5-nvidia-FlagOS与Claude对比分析:在复杂推理任务上的差异化表现
MiniCPM-o-4.5-nvidia-FlagOS与Claude对比分析:在复杂推理任务上的差异化表现 最近在AI圈子里,关于不同模型在复杂推理任务上的表现,讨论得挺热闹的。特别是像MiniCPM-o-4.5-nvidia-FlagOS(后面简称MiniCPM)和Claude这…...
Qwen-Image-Edit-2509入门指南:无需代码,用自然语言编辑图片
Qwen-Image-Edit-2509入门指南:无需代码,用自然语言编辑图片 1. 什么是Qwen-Image-Edit-2509? 想象一下,你只需要对着电脑说"把这张照片里的蓝天换成夕阳",图片就自动完成了修改——这就是Qwen-Image-Edit…...
