Python笔记(二十六)_魔法方法_属性的魔法方法
属性的魔法方法
__getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法
__setattr__(self,name,value):当一个属性被设置时,自动触发
__delattr__(self,name):当一个属性被删除时,自动触发
>>>class C:
def __getattribute__(self,name):
print('getattribute')
def __getattr__(self,name):
print('getattr')
def __setattr__(self,name,value):
print('setattr')
def __delattr__(self,name):
print('delattr')
>>>c = C()
>>>c.x
getarrribute
此处没有调用并打印getattr的原因,要从实例对象属性的访问顺序说起:
首先调用getattribute -> 然后在实例对象中查找 -> 继续在实例的类中查找 -> 最后在父类中查找 -> 均无法找到时调用getattr方法
是要当所有流程都走完,都没找到该属性,才会调用getattr方法,但由于重写了getattribute方法,所以需要用super()函数来调用父类
>>>class C:
def __getattribute__(self,name):
print('getattribute')
super().__getattribute__(name)
def __getattr__(self,name):
print('getattr')
def __setattr__(self,name,value):
print('setattr')
def __delattr__(self,name):
print('delattr')
>>>c = C()
>>>c.x
getarrribute
getattr
>>>c.x = 1
setattr
>>>c.x
getarrribute
1
>>>del c.x
delattr
__getattr__(self,name):当访问一个不存在的属性时,自动触发,默认返回值为None
正常情况下,当我们调用类的属性时,如果不存在这个属性会报错
但如果我们在类中重写了__getattr__方法,当用户访问不存在的类的属性时,python会自动调用__getattr__来获得在类中重写的属性或异常
>>>class Rectangle:
def __init__(self,height=5):
self.height = height
def __getattr__(self,name):
if name == 'width':
width = 10
return width
raise AttributeError('This attribute does not exist')
>>>r = Rectangle()
>>>r.height #调用类中存在的属性,不会触发__getattr__方法
5
>>>r.width #调用类中不存在的属性,触发__getattr__方法并获得属性
10
>>>r.name #调用类中不存在的属性,触发__getattr__方法并抛出异常
AttributeError: This attribute does not exist
这里要注意一个容易产生死循环的问题,比如例子:
>>>class Rectangle:
def __init__(self,widt = 0,height = 0):
self.width = width #此处有给属性赋值的操作,所以会自动触发__setattr__
self.height = height
def __setattr__(self,name,value):
if name == 'square':
self.width = value
self.height = value
else:
self.name = value #而在__setattr__方法中又存在赋值操作,所以产生无限递归
def getArea(self):
return self.width * self.height
修改方法:将else分支的语句改为super().__setattr__(name,value),此处直接调用父类的方法,免去赋值操作,就不会再产生递归
>>>r1 = Rectangle(4,5)
>>>r1.getArea()
20
>>>r1.square = 10
>>>r1.__dict__ #以列表的形式显示该对象的所有属性
{'width': 10, 'height': 10}
>>> r1.getArea()
100
Python笔记(二十六)_魔法方法_属性的魔法方法的更多相关文章
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- 使用Typescript重构axios(二十六)——添加HTTP授权auth属性
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Python笔记(二十四)_魔法方法_运算符的魔法方法
算数运算方法 .反运算方法 以对象A+对象B为例,都是将A作为self值,而B作为other值传入__add__(self,other)方法: 当用户输入A+B,就会调用重写的add方法: >& ...
- [Python笔记]第十六篇:web框架之Tornado
Tornado是一个基于python的web框架,xxxxx 安装 python -m pip install tornado 第一个Tornado程序 安装完毕我们就可以新建一个app.py文件,放 ...
- Java基础学习笔记二十六 JDBC
什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...
- angular学习笔记(二十八-附1)-$resource中的资源的方法
通过$resource获取到的资源,或者是通过$resource实例化的资源,资源本身就拥有了一些方法,$save,$delete,$remove,可以直接调用来保存该资源: 比如有一个$resour ...
- Python笔记(二十八)_魔法方法_迭代器
迭代器用于遍历容器中的数据,但它不是容器,它是一个实现了__next__方法的对象 与迭代器相关的内置函数: iter(): 将一个对象转换成一个迭代器 next(): 访问迭代器中的下一个变量,直到 ...
- Python笔记(二十二)_魔法方法_基本魔法方法
__init__(self[,...]) __init__和__new__组成python的构造器,但__init__更多的是负责初始化操作,相当于一个项目中的配置文件,__new__才是真正的构造函 ...
- Python笔记(二十五)_魔法方法_描述符
描述符的属性方法 __get__(self, instance, owner): 用于访问属性,返回属性的值 __set__(self, instance, value): 用于给属性赋值时,返回属性 ...
随机推荐
- 关于tomcat NoClassDefDoundErr异常的记录
在做DRP项目的时候,copy了drp1.3,粘贴重命名成drp1.4,把drp1.4加入到tomcat中,发现drp1.4中新加的jsp可以正常运行,而从1.3那copy来的不能运行,抛出NoCla ...
- RMQ 区间最大值最小值 最频繁次数
区间的最大值和最小值 #include <cstdio> #include <cstring> #include <cmath> #include <iost ...
- windows 安装apache2.4
https://segmentfault.com/a/1190000008767607 一.下载 1.下载地址: http://httpd.apache.org/download.cgi 2.找到Fi ...
- Python四种实现单例模式的方法
在这之前,先了解super()和__new__()方法 super()方法: 返回一个父类或兄弟类类型的代理对象,让你能够调用一些从继承过来的方法. 它有两个典型作用: a. 在单继承的类层次结构中, ...
- Spring Security初识
Spring Security与Spring Boot集成 添加依赖: <dependency> <groupId>org.springframework.boot</g ...
- 代理修饰词weak/assign/strong的区别
基于项目报错: WebViewJavascriptBridgeBase 中定义:@property (assign) id <WebViewJavascriptBridgeBaseDelegat ...
- POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )
题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 : ...
- [CF1177B]Digits Sequence (Hard Edition)题解
一个简单的模拟,首先先计算当前是几位数,然后根据几位数推断当前的数是什么,然后求出该位即可 #include <cstdio> int main(){ long long k; scanf ...
- 【CF1252G】Performance Review(线段树)
题意: n,q<=1e5,a[i],b[i][j]<=1e9,保证能力值互不相同,询问之间保留前面的影响 思路:其实把大于a[1]的看成0,小于的看成1,设第i天小于a[1]的有b[i]个 ...
- 如何实现echarts组织结构图节点的收缩
echarts本身没有组织结构图的节点收缩功能,因为项目需求要用到此功能. 引入的echarts必须是2版本的,因为3.0取消了对组织结构图的支持.下载2版本的源码,找到关于onclick事件那部分的 ...