Python 中的魔术方法(六)属性访问控制, __getattr__ 和 __getattribute__

halcon C++编程 第4讲 HObject/HImage Mat相互转换(tcy) 网上有很多相互转换程序,但并不知那个正确,本文对相互转换后的结果和原对象比较是否相同判断转换是否正确。经测试ok.本文包括转换代码及测试是否相同。 1.转换程序: /************************************ HObject转为Mat:time:2021/3/16 V1.0 *************************************/ cv::Mat HalconClass::HObjectToMat(const HalconCpp::HObject&.. 阅读详情

1. __getattr__ 和 __getattribute__区别

__getattr__只在没有找到目标属性时调用。很适合作为属性缺失时的缺省回调函数。

__getattribute__在查看对象的实际属性之前调用,需要注意避免无限递归。

 一个代码示例来展示两个方法的使用, 创建一个自定义字典, 可以使用 obj.attr 的语法来访问字典内的数据。 如 obj = {"a": "b"} , obj.a 返回 b。  增加一个size属性,返回字典数据个数。

In [1]: from collections import UserDict
   ...:
   ...: class DotDict(UserDict):
   ...:     def __init__(self, *args, **kwargs):
   ...:         super().__init__(*args, **kwargs)
   ...:         self.size = len(self)
   ...:
   ...:     def __getattribute__(self, name: str):
   ...:         return super().__getattribute__(name.lower())
   ...:
   ...:     def __getattr__(self, name):
   ...:         return self[name]
In [2]: mydict = DotDict(key='value', foo='aloha')

In [3]: mydict.size
Out[3]: 2
In [4]: mydict.SIZE
Out[4]: 2

 从以上代码可以看到, 创建一个字典 mydict 之后, mydict.size = 2.  每次使用 . 语法获取对象的属性时, __getattribute__ 方法会将属性名称转为小写, 所以mydict.SIZE == mydict.size 返回 2.

In [5]: mydict.foo
Out[5]: 'aloha'

 当使用 mydict.foo 获取属性 foo 的值时, 找不到属性 foo , 此时会调用 __getattr__ , 返回mydict['foo'] 的值, 返回 'aloha'.

2. __setattr__和__delattr__

__setattr__(self, name, value) - 与__getattr__ 不同的 是 , __setattr__ 是一种封装解决方案。它允许你在属性不存在时也可以定义分配给属性的行为。

__delattr__(self, name) - 与  __setattr__ 完全相同,只是是用于删除属性而不是设置。

注意: 使用这两个方法同样要注意避免无限递归。

def __setattr__(self ,name ,value):
    self.name  =  value

如上面代码,__setattr__ 中的 self.name 会再次调用 __setattr__自身,递归将永远持续下去,导致程序崩溃

给DotDict 增加一个函数

    class DotDict(UserDict):

    ...

    def __setattr__(self, name, value):
        self.__dict__[name] = value
In [6]: mydict.mo = 8989

In [7]: mydict.mo
Out[7]: 8989

可以在 目标对象 没有属性 mo 的时候,对属性进行赋值。

【实验】ENSP 实战:酒店有线 + 无线三层组网全配置(VLAN 规划 + AC/AP+SSID 绑定) 三层架构:出口路由器 → 核心交换机 → 汇聚交换机 → 接入交换机 / AP / 终端。 阅读详情

相关推荐

表面声波滤波器——叉指换能器设计实战:从关键参数到结构选型

本文深入探讨了表面声波滤波器核心部件叉指换能器的实战设计流程。从目标驱动出发,详细解析了如何根据中心频率确定关键参数指宽,并权衡叉指对数对带宽和插入损耗的影响。文章进一步介绍了通过变迹加权优化频率响应,并对比了梯形结构与纵向耦合谐振滤波器等主流结构选型的适用场景与优缺点,为工程师提供从理论计算到仿真验证的完整设计指南。

weixin_29216353的博客 105

Python属性拦截器之__getattribute__与__getattr__

Python魔术方法之属性拦截器__getattribute__

beichanbb的博客 1939

VSCode玩转Arduino:手把手解决‘未定义Serial’和头文件找不到的坑

本文详细介绍了在VSCode中配置Arduino开发环境时遇到的‘未定义Serial’和头文件找不到问题的解决方案。通过修改c_cpp_properties.json文件、调整IntelliSense引擎设置以及添加正确的库路径,开发者可以高效解决这些常见错误,提升开发体验。文章还提供了针对不同开发板和平台的高级配置技巧,确保配置的长期有效性。

weixin_42620202的博客 359

python 中的__getattr__和__getattribute__方法

python 中的__getattr__和__getattribute__方法的理解

qq_43745578的博客 1964

《Halcon 100项目-9》Halcon彩色线序检查

Halcon彩色线序检查

doubleintfloat的博客 1043

为什么RingMo能成为遥感领域的首个生成式自监督基础模型?

RingMo作为遥感领域首个生成式自监督基础模型,通过创新的图像掩码建模技术解决了传统方法在遥感图像处理中的挑战。该模型利用两百万张多元数据集进行预训练,在小目标检测、场景分类等任务上表现卓越,显著提升了性能指标。RingMo的技术突破为遥感图像解译提供了高效解决方案,降低了标注成本并增强了模型泛化能力。

ll5678的博客 691

第8.31节 Python中使用__delattr__清除属性数据

一、 引言 在前面几节我们介绍了__ getattribute__方法和__setattr__方法,分别实现了实例属性的查询和修改(含定义即新增),作为Python中数据操作必不可少的三剑客get、set、delete,get、set都有操作捕获方法,delete一样有对应操作的捕获方法,这个方法就是内置方法__delattr__。 二、 语法释义 语法:实例. delattr(属性名) 直接调...

老猿Python 2455

用 Python 和 uiautomation 实现微信批量发送

思路是这样,将要发送的人员名单(包括称呼)以及发送内容都维护到Excel里,程序运行时读取Excel里内容,自动搜索人员姓名(微信昵称或备注名),填入要发送的内容,拼接上称呼(如果需要的话)自动点击发送,这样轮巡直至名单人员全部发送完成。、

jankingdom的专栏 1471

2018-01-02-effective-python-04-metaclasses-and-attributes

layout title keywords category tags post 编写高质量的python代码 -- 04. 元类及属性 python python python metaclass 元类这个词,只是模糊地描述了一种高于类,而又超乎类的概念。简单来说,就是...

pemako的专栏 230

72-dify案例分享-揭秘!如何用 Dify 实现多语言 PDF 文档原格式翻译

本文围绕 Dify 1.6 + 版本,演示搭建 PDF 文档翻译 Agent:配置 MCP 服务、构建 Agent 并以 URL 传文件测试,实现高效翻译,展现 MCP 跨工具复用与简化集成的优势,助力 AI 应用开发。

个人技术 2287

深入理解JVM虚拟机第一篇:Java跨平台和字节码以及多语言混合编程

本位描述了Java的跨平台和JVM的跨平台的作用,Java语言的字节码的概念多语言混合编程应用到JVM虚拟机以及Java发展的重大事件。

七叔的博客 1万+

object 的方法

Object.assign 方法实行的是浅拷贝,而不是深拷贝。 也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。 同名属性会替换 Object.create(parent, {z : { writable:true, configurable:true, value:“newAdd”} }) 使用指定的原型对象及其属性去创建一个新的对象 Object.defineP...

Sunny的博客 376

STM32入门教程:WiFi通信

第四步:初始化串口 在生成的代码中,您可以找到一个名为 "USARTx_Init" 的函数,其中 "x" 是您选择的串口号。然后,我们使用 "AT+CIPSEND" 命令发送UDP数据,接收到服务器的回复,并在终端上显示收到的数据。在配置向导中,您可以选择启用USART串口功能,并根据您的硬件连接,将串口设置为与WiFi模块连接的串口。在上述代码中,我们使用了 "HAL_UART_Receive" 函数来接收串口数据,并使用 printf 来在终端上显示收到的数据。如果有任何问题,请随时向我提问。

2401_85258012的博客 1075

Python:getattr()函数和__getattribute__()魔术方法

Python内置函数getattr()用于动态获取对象属性,支持通过字符串指定属性名,比点运算符更灵活。其语法为getattr(object, name[, default]),当属性不存在时可返回默认值。文章通过Person类示例展示了getattr()在动态属性访问中的优势,并对比了点运算符的局限性。同时深入解析了getattr()底层调用__getattribute__()的机制,以及__getattr__()方法在属性不存在时的处理逻辑。

保持终身学习的能力,温故而知新 1706

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

python getattr和getattribute_getattr与getattribute的区别__

让我们看看__getattr__和__getattribute__魔术方法的一些简单示例。__getattr__每当您请求尚未定义的属性时,Python将调用__getattr__方法。在下面的示例中,我的类Count没有__getattr__方法。现在在main中,当我尝试同时访问obj1.mymin和obj1.mymax属性时,一切正常。但是当我试图访问obj1.mycurrent属性时——P...

weixin_39596835的博客 1382

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【超详解】Python中getattr和getattribute是如何调用的?

在Python中,getattr和getattribute是两个用于属性访问的重要函数。它们可以在运行时动态地获取对象的属性或自定义属性访问行为。这对于元编程、框架开发和动态编程非常有用。getattr函数可以根据属性名称获取对象的属性或方法。这个函数是Python内置的,通常用于获取对象的属性,但也可以用于方法的调用。方法是一个特殊的魔术方法,可以自定义对象的属性访问行为。通过重写这个方法,您可以拦截属性访问、修改或添加属性,从而实现高度定制的行为。方法还可以用于自定义属性的获取和修改行为。

aobulaien001的博客 2170

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python中魔术方法:关于__getattr__、__setattr__和__getattribute__中的关键点

python中关于__getattr__、__setattr__和__getattribute____getattr____getattribute____setattr__ getattr __getattr__比较好理解~ 首先明白__getattr__是什么。 **getattr()**函数会在你试图读取一个不存在的属性时,引发AttributeError异常。 下面看一段代码段。 class testclass: count = 0 name = [] def __init_

qq_46167902的博客 1042

Python 魔术方法 `__getattr__` 与 `__setattr__` 对比:3种动态属性管理方案

本文深入解析Python魔术方法`__getattr__`、`__setattr__`和`__getattribute__`在动态属性管理中的应用,对比三种方法的执行顺序、典型场景及性能影响,并提供实战案例与优化建议,帮助开发者高效实现属性动态管理。

dianchamian8747的博客 396

Python中getattr和getattribute的调用

在Python中,getattr和getattribute是两个用于属性访问的重要函数。它们可以在运行时动态地获取对象的属性或自定义属性访问行为。这对于元编程、框架开发和动态编程非常有用。getattr函数可以根据属性名称获取对象的属性或方法。这个函数是Python内置的,通常用于获取对象的属性,但也可以用于方法的调用。方法是一个特殊的魔术方法,可以自定义对象的属性访问行为。通过重写这个方法,您可以拦截属性访问、修改或添加属性,从而实现高度定制的行为。方法还可以用于自定义属性的获取和修改行为。

涛哥聊Python 298

Python自学成才之路 魔术方法之属性访问控制

Python中提供了一些魔术方法来控制对象属性的访问,赋值,删除过程。 属性访问魔术方法 __getattr__(self, item) __getattribute__(self, item) 其中__getattr__只有在属性不存在时会被调用,__getattribute__无论属性是否存在都会被调用,item参数就是要访问的属性。 属性赋值魔术方法 __setattr__(self, key, value) 给对象属性赋值或者添加新属性时会被调用。 属性删除魔术方法 __delattr__(se

超人不会飞 570

Python 魔术方法深度解析:__getattr__ 与 __getattribute__

通过掌握这两个魔术方法,开发者可以实现从简单的动态属性生成到复杂的元编程框架。建议在实际项目中优先使用。时自动触发,是 Python 属性访问链中的最后一道防线。(包括已存在的属性)都会触发此方法。,仅在需要全局控制时谨慎使用。当类中已存在同名方法时,**不存在的属性**

YAnt的博客 819

Python魔术方法揭秘__getattr__与__getattribute__的微妙区别

_getattr__和__getattribute__是Python属性访问系统的两大支柱。前者提供了一种优雅的回退机制,后者则提供了全面的拦截能力。理解它们的微妙差别、调用顺序和适用场景,能够帮助开发者编写出更加灵活、强大和Pythonic的代码。掌握这两个魔法方法,就等于掌握了Python对象属性访问的高级控制权。

mingxuan13141314的博客 727

属性相关的魔术方法

‘’’ 属性相关的魔术方法: 就是获取成员,删除成员,修改成员相关联的魔术方法而已 五个与属性相关的魔术方法: 1. getattr 2. setattr 3. delattr 4. getattribute 5. dir 属性访问的顺序: 1. 调用__getattribute__ 2. 调用数据描述符 3. 调用当前对象的所属成员 4. 调用类的所属成员 5. 调用非数据描述符 6. 调用父类...

weixin_45402288的博客 216

【Python】魔术方法是真的魔法!(第三期)

魔术方法是在尝试删除对象属性时被调用。它不会在对象正常生命周期结束时被调用,而是在使用。关键字删除属性时执行。该方法没有返回值,但在其中可以进行一些操作,如打印提示信息。),则当读取不存在属性时,程序将不会出现错误,而是返回预设的值。对存储在类级别的字典中,使得所有该类的对象共享这些自定义属性。魔术方法是在尝试访问对象不存在的属性时被调用的。来实现默认行为,但也支持自定义实现,例如将。,当设置对象属性时会被调用。函数时,如果要恢复其默认行为,应使用。函数,并在其中返回特定值(如。魔术方法有两个参数,

https://github.com/ianchen-dev 1130

Python中的魔术方法详解

在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述,但是对于官方的描述比较混乱而且组织比较松散。很难找到有一个例子。

飞羽的博客 1318

python_魔术方法-属性相关

属性相关的魔术方法: 就是获取成员,删除成员,修改成员相关联的魔术方法 4个与属性相关的常用魔术方法 1.__getattr__ 2.__setattr__ 3.__delattr__ 4.__getattribute__ 属性访问的顺序! 1.调用__getattribute__ 2.【调用数据描述符】 3.调用当前对象的所属成员 4.调用类的所属成员 5.【调用非数据描述符】 6.调用父类的...

cwy0502的博客 330
上一篇: Python 中的魔术方法(五)类的展示方法, __str__ 和 __repr__
下一篇: Python 中的魔术方法(七)自定义容器行为, __setitem__ 和 __getitem__ 等
be5yond
博客等级 码龄10年 590粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值