python class __getattr__ 与 __getattribute__ 的区别

news/2024/7/21 15:50:41/文章来源:https://blog.csdn.net/u010674101/article/details/139271776

在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__,可以使类的属性访问更加灵活,满足特定需求。合理使用这个方法可以增强代码的动态性和适应性,但滥用可能导致代码难以调试和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ldbm.cn/p/430437.html

如若内容造成侵权/违法违规/事实不符,请联系编程新知网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Postman更好的进行API渗透测试

在这个时代,Web 和移动应用程序通常是由 RESTful 网络服务提供支持的。 公共和私有 API 在互联网上非常普遍,测试这些 API 绝非易事,但有一些工具可以帮助你。 虽然(通常用与渗透测试)工具不能代替技能,但即使是最熟练的木匠也能用…

WebService的wsdl详解

webservice服务的wsdl内容详解,以及如何根据其内容编写调用代码 wsdl示例 展示一个webservice的wsdl,及调用这个接口的Axis客户端 wsdl This XML file does not appear to have any style information associated with it. The document tree is shown…

探索Django 5: 从零开始,打造你的第一个Web应用

今天我们将一起探索 Django 5,一个备受开发者喜爱的 Python Web 框架。我们会了解 Django 5 的简介,新特性,如何安装 Django,以及用 Django 编写一个简单的 “Hello, World” 网站。最后,我会推荐一本与 Django 5 相关…

分布式拒绝服务解决方式

在网络安全领域中,分布式拒绝服务(DDoS)攻击始终占据着举足轻重的地位,其影响力不容忽视。随着网络技术的日新月异和网络环境的日益复杂化,DDoS攻击不仅变得愈发频繁,而且其破坏性和影响力也呈现出惊人的增…

java项目之高校教师科研管理系统源码(springboot+vue+mysql)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的高校教师科研管理系统源码。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 高校教师科研管…

拉法空袭造成平民死伤 以军称发生地点不在“安全区”内

本文转自【央视新闻客户端】;当地时间5月27日,以色列国防军发布通告称,以军军法署署长伊法特耶鲁沙尔米指示以军总参谋部事实调查和评估机制就26日针对拉法西北部的空袭进行调查。通告指出,以方情报显示目标地点存在巴勒斯坦伊斯兰抵抗运动(哈马斯)高级成员,以军根据情报…

于AI对话 --如何更好的使用AI工具

文章目录 于AI对话 --如何更好的使用AI工具1、认识AI工具:2、对话原则:3、提问步骤:4、AI可以学习什么?5、提问技巧:1、提出假设性问题:2、(鼓励引导式提问)跨学科思考:举个例子: 3、…

【Unity】Unity项目转抖音小游戏(三)资源分包,抖音云CDN

业务需求,开始接触一下抖音小游戏相关的内容,开发过程中记录一下流程。 使用资源分包可以优化游戏启动速度,是抖音小游戏推荐的一种方式,抖音云也提供存放资源的CDN服务 抖音云官方文档:https://developer.open-douyi…

AI架构设计6:vLLM

训练大型语言模型以及微调的教程比比皆是,但关于在生产环境中部署它们并监控其活动的资料相对稀缺。上个章节提到了未来云原生的AI是趋势,然而涉及到云原生会比较偏技术。而在此之前为了解决大模型部署量产的问题,社区也一直在探索&#xff0…

HNU-计算机体系结构-实验3-缓存一致性

计算机体系结构 实验3 计科210X 甘晴void 202108010XXX 文章目录 计算机体系结构 实验31 实验目的2 实验过程2.0 预备知识2.0.1 多cache一致性算法——监听法2.0.1.1 MSI协议2.0.1.2 MESI协议2.0.1.3 本题讲解 2.0.2 多cache一致性算法——目录法2.0.2.1 有中心的目录法2.0.2…

二区5分纯生信|单细胞+非负矩阵+AlphaFold+机器学习组合

说在前面 学文不看刊 这篇分析总体来说工作量不算大,scRNA联合bulkRNA分析,多种机器学习组合预测模型,最后用了AlphaFold2预测蛋白及AutoDock分子对接 非常适合小白学习和模仿,其次在筛选出核心基因后可以再加几个外部数据集观…

win10如何查看本机ip地址?三招搞定,快来试试吧

在数字化时代,IP地址作为网络设备的唯一标识,对于计算机使用者来说具有重要意义。无论是为了进行网络设置、远程连接,还是解决网络问题,了解如何查看本机IP地址都是一项必备技能。对于使用Windows 10操作系统的用户来说&#xff0…

脑机接口:是现代医学的外挂,更是瘫痪病人的豪赌

5 月 17 日,马斯克公开表示,继今年年初首次成功将大脑芯片植入患者大脑后,Neuralink 正在寻找第二位受试者接受这项手术。 5 月 20 日,美国食品药品监督管理局 (FDA) 批准了马斯克的 Neuralink 公司为第二位患者植入脑芯片&#…

算法学习笔记(7)-贪心算法

##什么是贪心算法 一种常见的解决优化类型的问题,基本的思想是在问题的每个决策阶段,都选择当前看起来最优的选择,即贪心地做出局部最优解的决策,以期待获得全局最优解。 ##贪心算法与动态规划的区别(二者都为解决优化…

Android Ktor 网络请求框架

Ktor 是一个由 JetBrains 开发的用于 Kotlin 编程语言的应用框架,旨在创建高性能的异步服务器和客户端应用程序。由于完全基于 Kotlin 语言,Ktor 能够让开发者编写出简洁、可读性强且功能强大的代码,特别适合那些已经熟悉 Kotlin 的开发人员。…

mysql内存和磁盘的关系

mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上,但为了高效地执行查询操作,它也会将数据页(每个页通常为16KB)读入内存。MySQL的缓冲池(buffer pool)是在内存中的…

OpenMV的VisionBoard视觉识别开发板学习记录

此篇博客仅用于对VisionBoard的开发板的学习研究记录,没有教学内容。 一、资料来源 开发板资料链接 开发板环境搭建手册 开发板视频教程 板子的资料网站 openmv官方的网站 目录 一、资料来源二、针对 VisionBoard的目标识别和定位总结1. 目标识别功能1.1 物体检测…

vue 表格表头展示不下,显示。。。;鼠标悬浮展示全部

vue 表格表头展示不下&#xff0c;显示。。。&#xff1b;鼠标悬浮展示全部 <templateslot-scope"scope"slot"header"><span:title"临时证券类型"style"white-space:nowrap">{{ 临时证券类型 }}</span></templa…

YOLOV10阅读总结

GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection YOLOv10 - Ultralytics YOLO Docs https://arxiv.org/pdf/2405.14458 论文地址 最近yolo又出了个yolov10了&#xff0c;不得不感慨CV是真卷&#xff0c;毕竟yolov9也才没多久。记录一下阅读笔记。…

2024/5/28 P1247 取火柴游戏

取火柴游戏 题目描述 输入 k k k 及 k k k 个整数 n 1 , n 2 , ⋯ , n k n_1,n_2,\cdots,n_k n1​,n2​,⋯,nk​&#xff0c;表示有 k k k 堆火柴棒&#xff0c;第 i i i 堆火柴棒的根数为 n i n_i ni​&#xff1b;接着便是你和计算机取火柴棒的对弈游戏。取的规则如下&…