python的getattr和getattribute调用

1 python的getattr和getattribute调用

python类的属性包括类属性、实例属性,

类属性:直接在类顶层赋值,或通过类名.属性名=值赋值;

实例属性:通过self赋值,或通过实例名.属性名=值赋值;

类实例可以访问类属性和实例属性;

python的特性和描述符都用于管理属性。

一个特性或描述符管理一个单个的、特定的属性。

getattr、getattribute、setattr、delattr 可以管理多个属性。

重载__getattr__()和__getattribute__()方法,在获取类实例属性值时会被自动调用。

(1)__getattr__(),针对实例属性,获取属性值时,会被自动调用;

(2)__getattribute__(),针对类和实例属性,获取属性值时,会被自动调用。

用于基于委托的场景,比如,包装对象,管理嵌套对象的全部属性访问。

用法

class C:def __getattr__(self,name):passdef __getattribute__(self,name):passdef __setattr__(self,name,value):passdef __delattr__(self,name):pass
c=C()

描述

类实例c,

未定义属性attr,c.attr自动调用__getattr__(),

未定义或已定义属性attr,c.attr自动调用__getattribute__(),

设置实例属性值时,c.attr=value,自动调用__setattr__(),

删除实例属性时,del c.attr,自动调用__delattr__()。

__getattr__()和__getattribute__()需返回一个值。

未定义属性attr,同时存在__getattr__()和__getattribute__(),c.attr自动调用getattribute,不调用getattr。

都是通过实例名操作属性时自动调用对应方法,通过类名操作属性不触发对应方法的调用。

1.1 getattr

描述

python的__getattr__()方法,针对未定义的属性,拦截属性点号运算,即未定义的属性进行点号运算(.属性名)时自动调用getattr方法。已定义的属性进行点号运算不调用getattr方法。

类名不可访问实例属性,所以,通过类名操作实例属性报错。

未定义属性attr,实例名.attr,自动调用getattr。

NO点号运算是否调用getattr
1未定义属性attr,实例名.attr自动调用
2未定义属性attr,类名.attr不调用,报错 AttributeError
3已定义类属性attr,实例名.attr不调用
4已定义实例属性attr,实例名.attr不调用
5已定义类属性attr,类名.attr不调用
6已定义实例属性attr,类名.attr不调用,报错 AttributeError

示例

>>> class MyGet:day=30def __init__(self):self.url='www.tyxt.work'# 未定义的属性进行点号运算,自动调用 __getattr__def __getattr__(self,attr):print('__getattr__拦截点号运算')if attr=='name':return '梯阅线条'else:raise AttributeError(attr)>>> mg=MyGet()
# 已定义的类属性和实例属性,实例名.属性,不调用 __getattr__
>>> mg.day,mg.url
(30, 'www.tyxt.work')
>>> mg.addr='深圳'
>>> mg.addr
'深圳'
# 未定义的属性,实例名.属性,自动调用 __getattr__
>>> mg.name
__getattr__拦截点号运算
'梯阅线条'
>>> mg.age
__getattr__拦截点号运算
Traceback (most recent call last):File "<pyshell#20>", line 1, in <module>mg.ageFile "<pyshell#16>", line 11, in __getattr__raise AttributeError(attr)
AttributeError: age
# 已定义的类属性,类名.属性,不调用 __getattr__
>>> MyGet.day
30
# 未定义的属性,类名.属性,不调用 __getattr__ ,报错
>>> MyGet.month
Traceback (most recent call last):File "<pyshell#85>", line 1, in <module>MyGet.month
AttributeError: type object 'MyGet' has no attribute 'month'
# 已定义的实例属性,类名.实例属性,不调用 __getattr__ ,报错
>>> MyGet.url
Traceback (most recent call last):File "<pyshell#94>", line 1, in <module>MyGet.url
AttributeError: type object 'MyGet' has no attribute 'url'

1.2 getattribute

描述

python的__getattribute__()方法,针对全部属性,拦截属性点号运算,即全部属性的点号运算(.属性名),自动调用getattribute方法,包括已定义和未定义的属性。

实例可访问类属性和实例属性,所以,包括类属性和实例属性的点号运算。

类名不可访问实例属性,所以,通过类名操作实例属性报错。

未定义属性或已定义类属性或已定义实例属性为attr,实例名.attr,自动调用getattribute。

NO点号运算是否调用getattribute
1未定义属性attr,实例名.attr自动调用
2未定义属性attr,类名.attr不调用,报错 AttributeError
3已定义类属性attr,实例名.attr自动调用
4已定义实例属性attr,实例名.attr自动调用
5已定义类属性attr,类名.attr不调用
6已定义实例属性attr,类名.attr不调用,报错 AttributeError

示例

>>> class MyGet:day=30def __init__(self):self.url='www.tyxt.work'# 全部属性的点号运算,自动调用 __getattribute__def __getattribute__(self,attr):print('__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性',attr)>>> mg=MyGet()
# 已定义的类属性和实例属性,实例名.属性,自动调用 __getattribute__
>>> mg.day,mg.url
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 day
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 url
(None, None)
>>> mg.addr='深圳'
>>> mg.addr
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 addr
# 已定义的类属性,类名.类属性,不调用 __getattribute__
>>> MyGet.day
30
# 已定义的实例属性,类名.实例属性,不调用 __getattribute__ ,报错 
>>> MyGet.url
Traceback (most recent call last):File "<pyshell#91>", line 1, in <module>MyGet.url
AttributeError: type object 'MyGet' has no attribute 'url'
# 未定义的属性,实例名.属性,自动调用 __getattribute__
>>> mg.name
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 name
# 未定义的属性,类名.属性,不调用 __getattribute__ , 报错
>>> MyGet.name
Traceback (most recent call last):File "<pyshell#89>", line 1, in <module>MyGet.name
AttributeError: type object 'MyGet' has no attribute 'name'

1.3 setattr

描述

python的__setattr_\_()方法,超类和本类的self.attr=value赋值运算、实例名.attr=value赋值运算、原属性修改和新属性设置的赋值运算,都会自动调用 setattr方法。

类名.attr=value赋值运算,不调用settattr方法。

实例可访问类属性和实例属性,所以,包括类属性和实例属性的赋值运算。

未定义属性或已定义类属性或已定义实例属性为attr,实例名.attr=value,自动调用setattr。

NO赋值运算是否调用setattr
1超类self.attr=value自动调用
2本类self.attr=value自动调用
3已定义实例属性attr,实例名.attr=value,超类和本类自动调用
4已定义类属性attr,实例名.attr=value,超类和本类自动调用
5未定义属性attr,实例名.attr=value自动调用
6已定义实例属性attr,类名.attr=value,超类和本类不调用
7已定义类属性attr,类名.attr=value,超类和本类不调用
8未定义属性attr,类名.attr=value,超类和本类不调用

示例

>>> class MySuper:x=1def __init__(self,addr):self.addr=addrself.tel=110>>> class MySet(MySuper):day=30def __init__(self):self.url='www.tyxt.work'super().__init__('深圳')# 全部实例属性的赋值运算,自动调用 __setattr__# 包括超类属性的赋值运算# 包括原属性修改和新属性设置的赋值运算# 不包括类属性的赋值运算# 实例属性赋值形式:self.attr=value,实例名.attr=valuedef __setattr__(self,attr,value):print('__setattr__ 拦截实例属性的赋值运算,包括超类实例属性',attr)# 超类和本类的self.attr=value赋值运算,自动调用 __setattr__ 
# 类原属性赋值(x=1和day=30)运算,不调用 __setattr__
>>> ms=MySet()
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 url
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 addr
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 tel
# 实例名.attr=value,原实例属性赋值运算,自动调用 __setattr__ 
>>> ms.tel=120
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 tel
>>> ms.url='tyxt.work'
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 url
# 实例名.attr=value,新属性赋值运算,自动调用 __setattr__ 
>>> ms.age=9555
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 age
# 实例名.attr=value,原类属性赋值运算,自动调用 __setattr__ 
>>> ms.x=2;ms.day=31
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 x
__setattr__ 拦截实例属性的赋值运算,包括超类实例属性 day
# 类新属性赋值运算,不调用 __setattr__
>>> MySuper.y=2
>>> MySet.month=12

1.4 delattr

描述

python的__delattr__()方法,del 实例名.属性,删除类属性和实例属性、未定义的属性,都会自动调用 delattr方法。

实例可访问类属性和实例属性,所以,包括类属性和实例属性的删除操作。

类名不可访问实例属性,所以,通过类名操作实例属性报错。

未定义属性或已定义类属性或已定义实例属性为attr,del 实例名.attr,自动调用delattr。

NO删除操作是否调用delattr
1已定义实例属性attr,del 实例名.attr自动调用
2已定义类属性attr,del 实例名.attr自动调用
3未定义属性attr,del 实例名.attr自动调用
4已定义实例属性attr,del 类名.attr不调用,报错 AttributeError
5已定义类属性attr,del 类名.attr不调用
6未定义属性attr,del 类名.attr不调用,报错 AttributeError

示例

>>> class MyDel:day=30def __init__(self):self.url='www.tyxt.work'# del 实例名.属性,自动调用 __delattr__def __delattr__(self,attr):print('__delattr__ 拦截 del 实例名.属性 运算',attr)>>> md=MyDel()
# del 实例名.类属性,自动调用 __delattr__
>>> del md.day
__delattr__ 拦截 del 实例名.属性 运算 day
# del 实例名.实例属性,自动调用 __delattr__
>>> del md.url
__delattr__ 拦截 del 实例名.属性 运算 url
# del 类名.类属性,不调用 __delattr__
>>> del MyDel.day
# del 类名.实例属性,不调用 __delattr__ , 报错
>>> del MyDel.url
Traceback (most recent call last):File "<pyshell#105>", line 1, in <module>del MyDel.url
AttributeError: url
# del 实例名.attr ,attr 为不存在的属性 , 自动调用 __delattr__
>>> del md.x
__delattr__ 拦截 del 实例名.属性 运算 x

1.5 getattr和getattribute同时存在

描述

同时定义__getattr__()和__getattribute__()两个方法,未定义属性attr,实例名.attr,只调用getattribute方法,不调用getattr方法。

示例

>>> class MyGet:day=30def __init__(self):self.url='www.tyxt.work'# 未定义的属性进行点号运算,自动调用 __getattr__def __getattr__(self,attr):print('__getattr__拦截点号运算')# 全部属性的点号运算,自动调用 __getattribute__def __getattribute__(self,attr):print('__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性',attr)>>> mg=MyGet()
# 已定义类属性 day , 实例名.day , 自动调用 __getattribute__
>>> mg.day
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 day
# 已定义实例属性 url , 实例名.url , 自动调用 __getattribute__
>>> mg.url
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 url
# 未定义属性 x , 实例名.x , 自动调用 __getattribute__
>>> mg.x
__getattribute__ 拦截全部属性的点号运算,包括已定义和未定义的属性 x

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

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

相关文章

肠道炎症与年龄和阿尔茨海默病病理学相关:一项人类队列研究

谷禾健康 ​阿尔茨海默 研究表明&#xff0c;慢性低水平的炎症&#xff08;“炎症衰老”&#xff09;可能是年龄相关疾病的一个介导因素&#xff0c;而肠道微生物通过破坏肠道屏障可能会促进炎症。 虽然老化和阿尔茨海默病&#xff08;AD&#xff09;与肠道微生物群组成的改变有…

Mybatis缓存实现方式

文章目录 装饰器模式Cache 接口及核心实现Cache 接口装饰器1. BlockingCache2. FifoCache3. LruCache4. SoftCache5. WeakCache 小结 缓存是优化数据库性能的常用手段之一&#xff0c;我们在实践中经常使用的是 Memcached、Redis 等外部缓存组件&#xff0c;很多持久化框架提供…

SQLAlchemy快速入门

安装依赖 pip install sqlalchemy pip install pymysql创建数据库和表 # 创建数据库 drop database if exists sqlalchemy_demo; create database sqlalchemy_demo character set utf8mb4; use sqlalchemy_demo;# 创建表 drop table if exists user; create table user (id …

ClickHouse基础介绍

目录 前言 1、什么是clickhouse 2、OLAP场景的关键特征 3、列式存储更适合于OLAP场景的原因 4、clickhouse的独特功能 5、clickhouse的缺点 6、性能 6.1、单个大查询的吞吐量 6.2、处理短查询的延迟时间 6.3、处理大量短查询的吞吐量 6.4、数据的写入性能 前言 11月…

Keras实现seq2seq

概述 Seq2Seq是一种深度学习模型&#xff0c;主要用于处理序列到序列的转换问题&#xff0c;如机器翻译、对话生成等。该模型主要由两个循环神经网络&#xff08;RNN&#xff09;组成&#xff0c;一个是编码器&#xff08;Encoder&#xff09;&#xff0c;另一个是解码器…

C++——list容器放入赋值,交换与大小操作

1. list 赋值和交换 功能描述: 给list容器进行赋值&#xff0c;以及交换list容器 函数原型: 1.assign(beg, end); //将[beg, end)区间中的数据拷贝赋值给本身 2.assign(n, elem); //将n个elem拷贝赋值给本身 3.list& operator(const list &lst);//重载等…

Dart调用JS对10000条定位数据滤波

使用Dart调用JS&#xff0c;还是为了练习跨语言调用&#xff1b; 一、编写对应的JS代码 平时在开发时不推荐将算法放在JS里&#xff0c;我这里是简单的做一下数据过滤&#xff1b; 首先生成一些随机定位数据&#xff0c;在实际开发中可以使用真实数据&#xff1b; // 随机定…

git 常用命令 提交commit

提交一个commit git status test.txt 查看 指定文件test.txt 的状态 git add test.txt 添加 指定文件test.txt 到暂存区 git commit test.txt -m "commit msg" 提交 指定文件test.txtgit status …

汽车信息安全--芯片厂、OEM安全启动汇总(1)

目录 1.芯驰E3安全启动 2.STM32 X-CUBE-SBSFU 3.小米澎湃OS安全启动 4.小结 我在前篇文章里详细记录了车规MCU信息安全设计过程关于网络安全架构的思考过程,从芯片原厂、供应商、OEM等角度思考如何建立起完备的信任链; 不过这思考过程仅仅只是一家之言,因此我又对比了国…

vmware虚拟机安装esxi7.0步骤

一、安装准备 1、下载镜像文件 下载链接&#xff1a;https://pan.baidu.com/s/12XmWBCI1zgbpN4lewqYw6g 提取码&#xff1a;mdtx 2、vmware新建一个虚拟机 2.1 选择自定义 2.2 选择ESXi对应版本 2.3 选择稍后安装操作系统 2.4 默认选择 2.5 自定义虚拟机名称及存储位置 2…

forEach方法跳出循环

在for循环中&#xff0c;跳出循环有两种模式&#xff1a; break、continue&#xff1b;但是在forEach中&#xff0c;使用break或者continue都会报错&#xff1b;使用return在forEach不起作用&#xff0c;循环会继续执行&#xff0c;貌似充当了continue的角色。 forEach方法的机…

MyBatis学习二:Mapper代理开发、配置文件完成增删改查、注解开发

前言 公司要求没办法&#xff0c;前端也要了解一下后端知识&#xff0c;这里记录一下自己的学习 学习教程&#xff1a;黑马mybatis教程全套视频教程&#xff0c;2天Mybatis框架从入门到精通 文档&#xff1a; https://mybatis.net.cn/index.html Mapper代理开发 目的 解决…

Jenkins分布式实现: 构建弹性和可扩展的CI/CD环境!

Jenkins是一个流行的开源持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;工具&#xff0c;它通过自动化构建、测试和部署过程&#xff0c;帮助开发团队更高效地交付软件。Jenkins的…

element ui弹窗在别的弹窗下方,优先级不高的问题

在弹窗的标签中加入append-to-body即可解决该问题&#xff1b; <el-dialog:title"title":visible.sync"dialogVisible"width"60%":before-close"handleClose":close-on-click-modal"false"append-to-body > </el-…

Oracle sid和service_name(服务名)地址写法不同

文章目录 场景总结 场景 项目需要切换数据库&#xff0c;批量改完配置文件后发现怎么有的地址前有//&#xff0c;有的没有 &#xff0c;是不是哪里改错了 。 后来确认了下。 带// 的是使用service_name连接的方式&#xff0c;是没有错的。 1.使用service_name,配置方式&#…

a标签锚点链接 + 遇到的问题

目录 需求背景实现思路遇到的问题问题解决关于锚点链接其他问题 需求背景 页面左侧是一级、二级标题&#xff0c;页面右侧是一级、二级标题对应的内容点击左侧标题&#xff0c;锚点链接&#xff0c;右侧内容跳转到左侧标题对应的内容区域 实现思路 通过 a 标签 id 的方法实现…

嵌入式Linux之Ubuntu学习笔记(Makefile规则格式)

Makefile里面是由一系列的规则组成的&#xff0c;这些规则格式如下&#xff1a; 目标&#xff1a;依赖文件集合 命令1 命令2 …… 列&#xff1a; main&#xff1a;main.o input.o calcu.o gcc -o main main.o input.o calcu.o 命令列表中的每条命令必须以TAB键开始&am…

Mac——VsCode使用格式化工具进行整理和格式化

1. 打开VSCode编辑器。 2. 点击左下角⚙️图标&#xff0c;打开设置 3. 进入设置后&#xff0c;你会看到一个搜索框&#xff0c;在搜索框中输入 format on save 来查找相关设置项。 4. 在设置列表中找到 Editor: Format On Save 选项&#xff0c;勾选它以启用在保存文件时自动格…

LeetCode206链表反转

//我来理解一下运用递归求解 class Solution { public:ListNode* reverseList(ListNode* head) {//首先判断是否为最后一个元素if(head null|| head.next null){return head;//返回末尾元素}ListNode* receive;//此时进入循环的每一层都实现了temp接收head.next的结点进行…

详解bookkeeper AutoRecovery机制

引言小故事 张三在一家小型互联网公司上班&#xff0c;由于公司实行的996&#xff0c;因此经常有同事“不辞而别”&#xff0c;为了工作的正常推进&#xff0c;团队内达成了某种默契&#xff0c;这种默契就是通过某个规则来选出一个同事&#xff0c;这个同事除了工作之余还有额…