python属性管理getattr、getattribute、setattr和delattr避免循环

1 python属性管理getattr、getattribute、setattr和delattr避免循环

在__getattr__()、__getattribute__()和__setattr__()方法体内,通过self进行对应的点号运算、赋值运算,会自动调用当前实例的相应方法,导致无限循环。通过object或者__dict__可以避免循环。

NO项目方法体内避免循环
1__getattr__()已定义属性attr,self.attr
2__getattribute__()object.__getattribuite__(self,attr)
3__setattr__()object.__setattr__(self,attr,value) self.__dict__[attr]=value
4__delattr__()object.__delattr__(self,attr) del self.__dict__[attr]

1.1 getattr

未定义属性attr,进行点号运算-实例名.attr时,自动调用__getattr__()方法,所以可以在方法体对已定义属性进行点号运算,不会产生循环,因为实例名.已定义属性,不会触发__getattr__()方法。注意,方法体内不能对未定义属性进行点号运算,否则会产生循环。

1.1.1 self.attr触发无限循环

描述

getattr方法体内,未定义属性attr,self.attr,点号运算触发无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __getattr__(self,attr):print('获取属性值',attr)# 未定义属性attr,self.attr,点号运算,触发循环x=self.attr>>> lg=LoopGet()
>>> lg.a
1
>>> lg.c
获取属性值 c
获取属性值 attr
获取属性值 attr
获取属性值 attr
获取属性值 attr
# 未定义属性attr,实例名.attr,点号运算,触发循环

1.1.2 访问已定义属性避免循环

描述

__getattr__拦截未定义属性的点号运算,方法体内,self.已定义属性,拦截已定义属性来避免循环,或者直接return其他值来避免循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __getattr__(self,attr):print('获取属性值',attr)# 已定义属性attr,self.attr,点号运算,不调用 __getattr__ , 避免循环x=self.a>>> lg=LoopGet()
>>> lg.c
获取属性值 c

1.2 getattribute

未定义属性、已定义属性attr,进行点号运算-实例名.attr时,都会自动调用__getattribute__()方法,所以在方法体通过self.属性,对其他属性进行点号运算时,会触发__getattribute__(),导致产生循环。通过object.__getattribute__()避免无限循环。

1.2.1 self.attr触发无限循环

描述

getattribute方法体内,self.属性名,自动调用当前实例的getattribute,导致无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __getattribute__(self,attr):print('获取属性值',attr)# 已定义属性attr,self.attr,点号运算,触发循环x=self.b
>>> lg=LoopGet()
>>> lg.a
获取属性值 a
获取属性值 b
获取属性值 b
获取属性值 b
#无限循环获取属性 b>>> class LoopGet:a=1def __init__(self):self.b=2def __getattribute__(self,attr):print('获取属性值',attr)# 未定义属性attr,self.attr,点号运算,触发循环x=self.attr>>> lg=LoopGet()
>>> lg.a
获取属性值 a
获取属性值 attr
获取属性值 attr
获取属性值 attr
#无限循环获取属性 attr

1.2.2 self.__dict__触发无限循环

描述

getattribute方法体内,self.__dict__,自动调用当前实例的getattribute,导致无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __getattribute__(self,attr):print('获取属性值',attr)# self.__dict__ 触发 __getattribute__ ,导致循环x=self.__dict__[attr]>>> lg=LoopGet()
>>> lg.a
获取属性值 a
获取属性值 __dict__
获取属性值 __dict__

1.2.3 object.getattribute()避免循环

描述

getattribute方法体内,object.__getattribute__(self,attr),自动调用超类object的getattribute,避免无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __getattribute__(self,attr):print('获取属性值',attr)# object全部类的超类,通过 object.__getattribute__ 避免循环return object.__getattribute__(self,attr)>>> lg=LoopGet()
>>> lg.a
获取属性值 a
1
>>> lg.c
获取属性值 c
Traceback (most recent call last):File "<pyshell#19>", line 1, in <module>lg.cFile "<pyshell#16>", line 8, in __getattribute__return object.__getattribute__(self,attr)
AttributeError: 'LoopGet' object has no attribute 'c'

1.3 setattr

未定义属性或已定义类属性或已定义实例属性为attr,实例名.attr=value,自动调用python的__setattr__()方法。在setattr方法体内,self.attr=value,自动调用当前实例的setattr,导致无限循环。通过self.__dict__[attr]=value、object.__setattr__(self,attr,value)来避免无限循环。

__delattr__()和__setattr__()使用相同的方法来避免循环。

1.3.1 self.attr=value触发无限循环

描述

setattr方法体内,self.attr=value,自动调用当前实例的setattr,导致无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __setattr__(self,attr,value):print('设置属性值',attr)# self.attr 触发 __getattribute__ ,导致循环self.attr=value# 构造函数的 self.b=2 调用 setattr,方法体内 self.attr=value ,触发无限循环        
>>> lg=LoopGet()
设置属性值 b
设置属性值 attr
设置属性值 attr
设置属性值 attr

1.3.2 self.dict[attr]=value避免循环

描述

__setattr__()方法体内,self.__dict__[attr]=value,不调用setattr,避免循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __setattr__(self,attr,value):print('设置属性值',attr)# self.__dict__[attr]=value 不调用 __getattribute__ ,避免循环self.__dict__[attr]=value>>> lg=LoopGet()
设置属性值 b
>>> lg.a=11
设置属性值 a
>>> lg.b=3
设置属性值 b
>>> lg.c=5
设置属性值 c
>>> lg.c
5

1.3.3 object.setattr(self,attr,value)避免循环

描述

__setattr__()方法体内,object.__setattr__(self,attr,value),自动调用超类object的setattr,避免无限循环。

示例

>>> class LoopGet:a=1def __init__(self):self.b=2def __setattr__(self,attr,value):print('设置属性值',attr)# object.__setattr__(self,attr,value) 调用超类setattr ,避免循环object.__setattr__(self,attr,value)>>> lg=LoopGet()
设置属性值 b
>>> lg.a=11
设置属性值 a
>>> lg.b=3
设置属性值 b
>>> lg.c=5
设置属性值 c
>>> lg.c
5

1.4 delattr

del 实例名.attr,自动调用python的__delattr__()方法。在setattr方法体内,del self.attr自动调用当前实例的delattr,导致无限循环。

通过del self.__dict__[attr]、object.__delattr__(self,attr)来避免无限循环。

注:只能删实例属性,不能删类属性。

1.4.1 del self.attr触发无限循环

描述

__delattr__()方法体内,del self.attr,自动调用当前实例的delattr,导致无限循环。

示例

>>> class LoopDel:a=1def __init__(self):self.b=2def __delattr__(self,attr):print('删除属性',attr)# del self.attr ,调用当前实例的 delattr , 导致循环del self.attr>>> ld=LoopDel()
>>> del ld.a
删除属性 a
删除属性 attr
删除属性 attr
删除属性 attr
删除属性 attr

1.4.2 del self.dict[attr]避免循环

描述

__delattr__()方法体内,del self.__dict__[attr],不调用delattr,避免循环。

注:只能删实例属性,不能删类属性。

示例

>>> class LoopDel:a=1def __init__(self):self.b=2def __delattr__(self,attr):print('删除属性',attr)# del self.__dict__[attr] ,不调用 delattr , 避免循环# 只能删 实例属性, 不能删类属性del self.__dict__[attr]>>> ld=LoopDel()
# 删实例属性
>>> del ld.b
删除属性 b
# 删类属性失败
>>> del ld.a
删除属性 a
Traceback (most recent call last):File "<pyshell#64>", line 1, in <module>del ld.aFile "<pyshell#60>", line 9, in __delattr__del self.__dict__[attr]
KeyError: 'a'

1.4.3 object.__delattr(self,attr)避免循环

描述

__delattr__()方法体内,object.__delattr__(self,attr),自动调用超类object的delattr,避免无限循环。

注:只能删实例属性,不能删类属性。

示例

>>> class LoopDel:a=1def __init__(self):self.b=2def __delattr__(self,attr):print('删除属性',attr)# object.__delattr__(self,attr) ,调用超类 delattr , 避免循环# 只能删 实例属性, 不能删类属性object.__delattr__(self,attr)>>> ld=LoopDel()
>>> del ld.b
删除属性 b
>>> del ld.a
删除属性 a
Traceback (most recent call last):File "<pyshell#69>", line 1, in <module>del ld.aFile "<pyshell#66>", line 8, in __delattr__object.__delattr__(self,attr)
AttributeError: a

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

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

相关文章

小红书 X WSDM 2024「对话式多文档问答挑战赛」火热开赛!

基于大语言模型&#xff08;LLM&#xff09;的对话问答机器人&#xff0c;已经成为当前人工智能领域学术界和工业界共同关注的的热门研究方向之一。在对话过程中&#xff0c;为大模型引入搜索结果&#xff0c;进行检索增强的生成&#xff08;Retrieval Augmented Generation&am…

MyBatis-Plus实现自定义SQL语句的分页查询

正常开发的时候&#xff0c;有时候要写一个多表查询&#xff0c;然后多表查询之后还需要分页&#xff0c;MyBatis-Plus的分页插件功能挺不错的&#xff0c;可以很简单实现自定义SQL的分页查询。 分页插件配置 import com.baomidou.mybatisplus.annotation.DbType; import com…

深度解析Webpack:现代前端工程化的利器

引言&#xff1a; 前端工程化是当今前端开发的不可或缺的一部分&#xff0c;而Webpack作为其中的瑞士军刀&#xff0c;在项目构建和优化中扮演着至关重要的角色。本文将深度解析Webpack&#xff0c;从基础概念到实际应用&#xff0c;为前端开发者提供全面的学习指南&#xff0…

MyBatis自定义类型处理器 TypeHandler(通俗易懂,效率起飞),处理jsonb、数组、枚举类型。支持MybatisPlus

一 使用场景 在项目开发过程中&#xff0c;我们经常遇到这样的情况&#xff1a;Java 对象中的数据类型与数据库中的字段类型不一致。这时&#xff0c;我们需要在保存数据到数据库和从数据库检索数据时进行类型转换。例如&#xff1a; 对于一些数据库特有的数据类型&#xff0…

Go语言并发模式视角思考

犹记得2019年中旬进行知识点的学习和demo的练习&#xff0c;熟悉各种语法和并发调度的场景&#xff0c; 在2019年末开始参与项目实战开发和逻辑梳理 Go语言的接触也是更多探索和业务的拆件&#xff0c;做一些雏形工具&#xff0c;来慢慢的孵化业务生态 后来陆陆续续&#xff…

时间序列预测 — LSTM实现多变量多步负荷预测(Tensorflow):多输入多输出

目录 1 数据处理 1.1 导入库文件 1.2 导入数据集 ​1.3 缺失值分析 2 构造训练数据 3 LSTM模型训练 4 LSTM模型预测 4.1 分量预测 4.2 可视化 1 数据处理 1.1 导入库文件 import time import datetime import pandas as pd import numpy as np import matplotlib.p…

软件测试|教你如何使用UPDATE修改数据

简介 在SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;UPDATE语句用于修改数据库表中的数据。通过UPDATE语句&#xff0c;我们可以更新表中的特定记录或多条记录&#xff0c;从而实现数据的修改和更新。本文将详细介绍SQL UPDATE语句的语法、用法以及一…

【AI视野·今日Robot 机器人论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 1 Jan 2024 Totally 16 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers MURP: Multi-Agent Ultra-Wideband Relative Pose Estimation with Constrained Communications in 3D Environments Authors A…

【高效视频处理】BMF 项目安装与老视频修复体验全流程及总结

一、BMF简介 BMF&#xff08;Babit Multimedia Framework&#xff09;是字节跳动开发的跨平台、多语言、可定制的多媒体处理框架。经过 4 年多的测试和改进&#xff0c;BMF 已经过量身定制&#xff0c;能够熟练地应对我们现实生产环境中的挑战。目前广泛应用于字节跳动的视频串…

JS题库复习(JavaScript标记版)

JavaScript标记版 1 "有以下 ES6 代码 function * gen() { yield 1; yield 2; yield 3; } 下面选项描述正确的是哪个&#xff1f;" A gen()执行后返回2 B gen()执行后返回 undefined C gen()执行后返回一个 Generator 对象 D gen()执行后返回 1 C Ja…

主流大语言模型从预训练到微调的技术原理

引言 本文设计的内容主要包含以下几个方面&#xff1a; 比较 LLaMA、ChatGLM、Falcon 等大语言模型的细节&#xff1a;tokenizer、位置编码、Layer Normalization、激活函数等。大语言模型的分布式训练技术&#xff1a;数据并行、张量模型并行、流水线并行、3D 并行、零冗余优…

机器学习--回归算法

&#x1f333;&#x1f333;&#x1f333;小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。 &#x1…

IOS:Safari无法播放MP4(H.264编码)

一、问题描述 MP4使用H.264编码通常具有良好的兼容性&#xff0c;因为H.264是一种广泛支持的视频编码标准。它可以在许多设备和平台上播放&#xff0c;包括电脑、移动设备和流媒体设备。 使用caniuse查询H.264兼容性&#xff0c;看似确实具有良好的兼容性&#xff1a; 然而…

树莓派和电脑之间的串口通信

一开始我们配置了串口登录树莓派&#xff0c;这样会导致我们后面在用树莓派的时候有些冲突&#xff0c;所以我们需要先修改树莓派串口的一些配置 /* 修改 cmdline.txt文件 */ >cd /boot/ >sudo vim cmdline.txt 删除【】之间的部分 dwc_otg.lpm_enable0 【consolettyAMA0…

【响应式编程-05】Lambda方法引用

一、简要描述 Lambda的方法引用也叫引用方法 方法引用初体验方法引用的底层实现方法引用的语法格式方法引用举例 静态方法引用构造方法引用普通方法引用super和this方法引用数组的方法引用 二、方法引用初体验 为什么出现方法引用&#xff1f; 引用已存在方法&#xff0c;避免重…

四则运算 C语言xdoj20

问题描述&#xff1a; 输入两个整数和一个四则运算符&#xff0c;根据运算符计算并输出其运算结果&#xff08;和、差、积、商、余之一&#xff09;。注意做整除及求余运算时&#xff0c;除数不能为零。 输入说明&#xff1a; 使用scanf()函数输入两个整数和一个运算符&#xf…

政府采购变数大,AI PC是联想的“新希望”?

文&#xff5c;新熔财经 作者&#xff5c;余一 发布两款AI PC&#xff0c;并预热CES将有AI PC大动作后&#xff0c;联想似乎找到了计算机终端的新思路。 而在这之前&#xff0c;联想终端业务面临的挑战不可谓不严重。 “事业单位更换纯国产电脑”、“联想被排除在大订单之外…

前端面试题-nodejs

1.什么是nodejs&#xff0c;它与传统的网页服务器有什么不同&#xff1f; 是什么&#xff1f;nodejs是基于Chrome V8引擎的JavaScript运行环境&#xff0c;它可以使JavaScript代码在服务器上运行。 有什么不同&#xff1f;第一&#xff0c;nodejs采用事件驱动、非阻塞式I/O模型…

汽车电子行业的 C 语言编程标准

前言 之前分享了一些编程规范相关的文章&#xff0c;有位读者提到了汽车电子行业的MISRA C标准&#xff0c;说这个很不错。 本次给大家找来了一篇汽车电子行业的MISRA C标准的文章一同学习下。 什么是MISRA&#xff1f; MISRA (The Motor Industry Software Reliability Ass…

微型导轨在设备中起什么作用

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;可以用于电子制造设备、半导体制造设备、医疗设备、光学设备和机器人等各种工业机械设备中&#xff0c;那么微型导轨在设备中起什么作用呢&#xff1f; 1、导向与定位&#xff1a;为机…