类中的__getattr__ 与 __setattr__ 魔法方法
1、__getattr__
当我们访问一个不存在的属性的时候,会抛出异常,提示我们不存在这个属性。而这个异常就是__getattr__方法抛出的,其原因在于他是访问一个不存在的属性的最后落脚点,作为异常抛出的地方提示出错再适合不过了。
看例子,我们找一个存在的属性和不存在的属性。
- class A(object):
- def __init__(self, value):
- self.value = value
- def __getattr__(self, item):
- print "into __getattr__"
- return "can not find"
- a = A(10)
- print a.value
- # 10
- print a.name
- # into __getattr__
- # can not find
可以看出,访问存在的属性时,会正常返回值,若该值不存在,则会进入最后的兜底函数__getattr__。
2、__setattr__
在对一个属性设置值的时候,会调用到这个函数,每个设置值的方式都会进入这个方法。
- class A(object):
- def __init__(self, value):
- print "into __init__"
- self.value = value
- def __setattr__(self, name, value):
- print "into __setattr__"
- if value == 10:
- print "from __init__"
- object.__setattr__(self, name, value)
- a = A(10)
- # into __init__
- # into __setattr__
- # from __init__
- print a.value
- # 10
- a.value = 100
- # into __setattr__
- print a.value
- # 100
在实例化的时候,会进行初始化,在__init__里,对value的属性值进行了设置,这时候会调用__setattr__方法。
在对a.value重新设置值100的时候,会再次进入__setattr__方法。
需要注意的地方是,在重写__setattr__方法的时候千万不要重复调用造成死循环。
比如:
- class A(object):
- def __init__(self, value):
- self.value = value
- def __setattr__(self, name, value):
- self.name = value
这是个死循环。当我们实例化这个类的时候,会进入__init__,然后对value进行设置值,设置值会进入__setattr__方法,而__setattr__方法里面又有一个self.name=value设置值的操作,会再次调用自身__setattr__,造成死循环。
除了上面调用object类的__setattr__避开死循环,还可以如下重写__setattr__避开循环。
- class A(object):
- def __init__(self, value):
- self.value = value
- def __setattr__(self, name, value):
- self.__dict__[name] = value
- a = A(10)
- print a.value
- # 10
3、__delattr__
__delattr__是个删除属性的方法
- class A(object):
- def __init__(self, value):
- self.value = value
- def __delattr__(self, item):
- object.__delattr__(self, item)
- def __getattr__(self, item):
- return "when can not find attribute into __getattr__"
- a = A(10)
- print a.value
- # 10
- del a.value
- print a.value
- # when can not find attribute into __getattr__
__delattr__也要避免死循环的问题,就如__setattr__一样,在重写__delattr__,避免重复调用。
类中的__getattr__ 与 __setattr__ 魔法方法的更多相关文章
- 第8章 Python类中常用的特殊变量和方法目录
第8章 Python类中常用的特殊变量和方法 第8.1节 Python类的构造方法__init__深入剖析:语法释义 第8.2节 Python类的__init__方法深入剖析:构造方法案例详解 第8. ...
- 转载:java 中对类中的属性使用set/get方法的意义和用法
经常看到有朋友提到类似:对类中的属性使用set/get方法的作用?理论的回答当然是封闭性之类的,但是这样对我们有什么作用呢?为什么要这样设计?我直接使用属性名来访问不是更直接,代码更简洁明了吗?下面我 ...
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
- 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。
在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...
- 第8.34节 《Python类中常用的特殊变量和方法》总结
本章介绍了Python类中常用的特殊变量和方法,这些特殊变量和方法都有特殊的用途,是Python强大功能的基石之一,许多功能非常有Python特色.由于Python中一切皆对象,理解这些特殊变量和方法 ...
- C#类中的字段、属性和方法
C#类中的字段.属性和方法 刚开始学C#,对于类中的字段.属性和方法很难分清,写下这份笔记,帮助理解 字段:与类相关的变量 声明方法与声明变量类似,可在前面添加访问修饰符.static关键字等: 属性 ...
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python类与对象各个算数运算魔法方法总结
1.python类与对象各个算术运算魔法方法总结: 2.各个魔法方法应用举例: 3.实例训练: (1)我们都知道在 Python 中,两个字符串相加会自动拼接字符串,但遗憾的是两个字符串相减却抛出异常 ...
- python中几个常见的魔法方法
首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...
随机推荐
- win10 安装vb -打开后一直显示无响应-解决
1.成功安装vb ,美滋滋的运行 ,但是一直卡在无响应状态, 2.解决 使用管理员权限打开即可,也可以更改兼容为win7/8, 神奇的是,我这电脑自用过一次管理员权限打开,后面再使用vb可以不用管理员 ...
- [转]Python3字符串前缀u、b、r
1.无前缀 & u前缀 字符串默认创建即以Unicode编码存储,可以存储中文. string = 'a' 等效于 string = u'a' Unicode中通常每个字符由2个字节表示 ...
- mysql数据库安装教程
centos 7安装mysql教程 一.卸载mariadb 注:卸载mariadb,否则安装Mysql会出现冲突 [root@mysqlmaster ~]# rpm -qa |grep mariadb ...
- 聊聊docker那些端口问题
今天来系统聊一聊docker的端口,常见的有容器内程序端口.容器端口.主机端口.Dockerfile中EXPOSE端口.docker-compose和docker run中的port等. 貌似很多端口 ...
- 使用Eclipse新建项目
如果图片损坏,点击查看: https://www.toutiao.com/i6496078011538866702/ 出现"新建"对话框,输入mavem 点击创建"简单M ...
- session反序列化
先来了解一下关于session的一些基础知识 什么是session?在计算机中,尤其是在网络应用中,称为"会话控制".Session 对象存储特定用户会话所需的属性及配置信息.这样 ...
- 深度学习之BP算法
1.介绍 人工神经网络(Artificial Neural Network,ANN)简称神经网络(NN),是在现代生物学研究人脑组织所取得成果的基础上提出来的.人工神经网络是大脑生物结构的数学建模,有 ...
- 面试必问之 CopyOnWriteArrayList,你了解多少?
一.摘要 在介绍 CopyOnWriteArrayList 之前,我们一起先来看看如下方法执行结果,代码内容如下: public static void main(String[] args) { L ...
- 如何使用 GitHub Pages 维护自己的博客
目录 前置知识 实际操作 声明 本文地址:如何使用 GitHub Pages 维护自己的博客 前置知识 首先,你应该知道如何用 Hexo 在本地搭建一个博客系统,具体见 Hexo. 其次,我们如果想使 ...
- golang中闭包讲解
1. 非闭包时的结果 package main import "fmt" func main() { var funcSlice []func() for i := 0; i &l ...