| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> Python中的__setattr__()、__getattr__()、__getattribute__() -> 正文阅读 |
|
[Python知识库]Python中的__setattr__()、__getattr__()、__getattribute__() |
? ? ? ? 人生第一篇博客吧,就拿最近一直在学的特性魔法来写吧,由于工作的原因一直在学习《Python基础教程》这本书,书中内容很丰富,但在有些地方讲述有些迷惑,就个人写一下随笔,记录一下个人认识,方便个人学习,也请有错误各位大佬指正。 ? ? ? ? 先把没那么狠的两种方法介绍一下吧,首先介绍一下以下两种方法的个人理解: __setattr__(self,name,value):这种方法在属性被赋值时会自动调用 __getattr__(self,name):这种方法在属性被访问却不存在于对象时会自动调用这个方法。 有了这两个家伙的基本定义,看一下以下代码 (不要纠结为啥我还在用IDLE(/▽\)) 以上代码创建了一个example类并把它实例化,我们运行一下,是不是按照直白认识他不会输出任何值? 看到这个时候人可能是傻的,但是稍微转化一下思维,我们在实例化时自动调用了__init__()构造方法,其中有以下内容: ? ?这两个语句对类属性名为a,b的进行了赋值操作,即二人都会自动调用__setattr__()方法,又因为二人名字并非word,故而会输出两次target。 接下来继续,在原代码基础上进行修改: 我在原代码基础上增加了两条语句,用以对__getattr__()进行探讨,此代码输出如下: 有了上面的解析思维,我们解析一下这个输出结果。 J.word对属性进行了访问,而这种属性原本不存在于类中,调用__getattr__(),获得"nice" J.w同理,获得"wow" 在此基础上继续增加语句 J.word获得元组赋值,即调用__setattr__()发现符合第一个if条件,执行if内容。 然后输出2 3? 错了,对待这些家伙不能直来直去,以下是结果: 其实不难分析,抛去已经分析的不谈(doge),我在调用__setattr__()时内有赋值操作,这个操作会再次调用__setattr__(),赋值两次,由此会输出两次target,至于wow,我个人介绍以下理解(类方面学的不好,很大可能有错误,望指正): 在构造方法中,self.a和self.b创建的两种属性实际上处在类似游戏王中描述的不存在于场上也不存在于墓地,但存在于创建方的”浮幽灵“状态,他们是类的属性吗?是。对象是类的实例化吗?是。这些属性存在于对象吗?不存在。 为什么这么说呢,可以紧跟类创建语句加入类似o=1,然后访问J.o,此使不会自动调用__getsttr__(),因为他是实打实的属性,出身于类。 这样以来就说的通了,在print()语句中访问了两次a与b,而不存在于对象,然后名字又不是我们规定的word,故而获得了wow。 说的通了?再次增添两句语句。 输出结果如下: ? ?人麻了?wow怎么变成2 3了? ?其实不难理解,只要知道__dict__()的特性即可,__dict__是一个属性字典,其中包含所有的实例属性(书中原话)。所有欸,把a,b也算进去了,即a,b摆脱了“浮幽灵”状态,成为了一个实打实的属性存在,故而在访问时会正常将值输出。 以上是介绍最终形态。 下面介绍狠人__getattribute__(self,name) 其定义为:在属性被访问时自动调用 为啥说他狠呢,他会拦截__dict__和__getattr__ 看一下以下代码 当我赋值时,调用赋值方法,我对word进行操作,执行if语句后内容,到print开始与之前出现分歧,此时程序完全无视了__getattr__转而去执行__getattribute__,故而一切都明了了 以上内容全然是我个人理解,望各位交流指正。 小白在此谢过了!!! ? ? |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 3:36:39- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |