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

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

典型应用场景

  1. 延迟加载属性:当某些属性的计算开销较大且可能并不总是需要时,可以使用__getattr__在第一次访问时计算并缓存这些属性。

  2. 代理模式:在代理对象中,将对不存在属性的访问转发到实际对象。

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
  1. 配置管理:在动态生成配置项时,可以通过__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拦截所有请求&#xff0c;控制在规定时间内请求次数。 1&#xff1a;添加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&#xff08;KMS&#xff09;是一项用于创建和管理加密密钥的托管服务&#xff0c;可帮助客户保护其数据的安全性和机密性。 比如一家医疗保健公司需要在AWS上存储敏感的病人健康数据&#xff0c;需要对数据进行加密以确保数据的机密性。他们使用AW…...

esp32 固件备份 固件恢复

首先是固件备份&#xff0c;这个在产品的工程管理中还是相当重要的。由于工具链的更新&#xff08;工具版本&#xff09;&#xff0c;以及板子或其上物料的变更&#xff08;硬件版本&#xff09;&#xff0c;或者新的库的导入或原有库的删除&#xff0c;PCBA是分分钟有可能死给…...

linux开发之设备树四、设备树中断节点

中断节点 这里是由原厂的BSP工程师写的一部分 在CPU的外部有一个GIC控制器&#xff0c;外设会连接在GIC控制器上 设备树是对硬件进行描述的&#xff0c;所以设备树会对CPU进行描述&#xff0c;也要对GIC 控制器进行描述&#xff0c;这部分的代码由原厂的BSP工程师进行编写&…...

基于STM32实现智能楼宇对讲系统

目录 引言环境准备智能楼宇对讲系统基础代码示例&#xff1a;实现智能楼宇对讲系统 音频输入和输出按键控制显示屏和用户界面网络通信应用场景&#xff1a;楼宇安防与智能家居问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现智能…...

一丹一世界FLUX.1部署教程:防火墙开放7861端口+nginx反向代理+HTTPS安全加固

一丹一世界FLUX.1部署教程&#xff1a;防火墙开放7861端口nginx反向代理HTTPS安全加固 1. 引言&#xff1a;从本地服务到安全可靠的在线AI画板 你可能已经体验过在本地服务器上运行“一丹一世界”FLUX.1 AI图像生成服务&#xff0c;通过http://你的IP:7861访问那个简洁的界面…...

告别串口调试助手:用Chrome浏览器直接调试Arduino/ESP32(Web Serial API实战)

浏览器直连硬件&#xff1a;Web Serial API在物联网开发中的高阶应用 每次调试Arduino或ESP32设备时&#xff0c;那些繁琐的串口助手切换、驱动安装和兼容性问题是否让您感到疲惫&#xff1f;现在&#xff0c;只需一个Chrome浏览器窗口&#xff0c;就能完成从设备连接到数据可…...

SenseVoice-small部署教程:国产昇腾AI芯片Ascend CANN适配进展

SenseVoice-small部署教程&#xff1a;国产昇腾AI芯片Ascend CANN适配进展 1. 引言&#xff1a;当语音识别遇上国产算力 想象一下&#xff0c;你正在开发一款面向医疗场景的离线语音助手&#xff0c;需要实时将医生的口述病历转成文字。数据隐私要求极高&#xff0c;不能上传…...

用OB_Template实现笔记高效管理与知识沉淀:从入门到精通

用OB_Template实现笔记高效管理与知识沉淀&#xff1a;从入门到精通 【免费下载链接】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

开源视频编辑解决方案&#xff1a;从零构建专业级Web视频编辑器OpenCut 【免费下载链接】OpenCut The open-source CapCut alternative 项目地址: https://gitcode.com/gh_mirrors/ap/OpenCut 在数字内容创作爆炸的时代&#xff0c;视频编辑工具的选择直接影响创作效率与…...

终极指南:OpenAI Python SDK推理强度参数调优实战

终极指南&#xff1a;OpenAI Python SDK推理强度参数调优实战 【免费下载链接】openai-python The official Python library for the OpenAI API 项目地址: https://gitcode.com/GitHub_Trending/op/openai-python 掌握OpenAI Python SDK推理强度参数配置&#xff0c;让…...

C# rtwpriv Wi-Fi定频工具

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录一、使用简介&#xff0c;说明#前言 对于无线产品&#xff0c;很多需要做CE,FCC,SRRC等认证&#xff0c;需要测试RF&#xff0c;像Realtek方案的Wi-Fi用到rtwpriv工具…...

CentOS7服务器流量飙升?别慌,用iftop+nload快速揪出‘吃流量’的进程

CentOS7服务器流量异常排查实战&#xff1a;iftop与nload组合拳 深夜的告警铃声突然响起&#xff0c;监控系统显示某台核心业务服务器的带宽使用率飙升至95%。作为运维人员&#xff0c;这种场景并不陌生——可能是业务量激增&#xff0c;也可能是恶意攻击&#xff0c;或是某个失…...

MiniCPM-o-4.5-nvidia-FlagOS与Claude对比分析:在复杂推理任务上的差异化表现

MiniCPM-o-4.5-nvidia-FlagOS与Claude对比分析&#xff1a;在复杂推理任务上的差异化表现 最近在AI圈子里&#xff0c;关于不同模型在复杂推理任务上的表现&#xff0c;讨论得挺热闹的。特别是像MiniCPM-o-4.5-nvidia-FlagOS&#xff08;后面简称MiniCPM&#xff09;和Claude这…...

Qwen-Image-Edit-2509入门指南:无需代码,用自然语言编辑图片

Qwen-Image-Edit-2509入门指南&#xff1a;无需代码&#xff0c;用自然语言编辑图片 1. 什么是Qwen-Image-Edit-2509&#xff1f; 想象一下&#xff0c;你只需要对着电脑说"把这张照片里的蓝天换成夕阳"&#xff0c;图片就自动完成了修改——这就是Qwen-Image-Edit…...