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): 用于给属性赋值时,返回属性 ...
随机推荐
- 43. Multiply Strings (JAVA)
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- 八、LaTex中的表格
- 02CSS
1.简介 从事网页制作或者相关工作,就要学习HTML,CSS.其中HTML是网页制作的主要语言网页的基础,CSS层叠样式表,主要用来修饰页面的元素 CSS 是 Cascading Style Shee ...
- Qt的QSettings类和.ini文件读写
Detailed Description QSettings类提供了持久的跨平台的应用程序设置.用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表 ...
- linux find 用法和常见用例
Linux中find常见用法示例 ·find path -option [ -print ] [ -exec -ok command ] {} \; 本人qq群也有许多 ...
- 生成keystore
Android平台打包发布apk应用,需要使用数字证书(.keystore文件)进行签名,用于表明开发者身份,可以使用JRE环境中的keytool命令生成.以下是windows平台生成证书的方法: 安 ...
- 前端每日实战:16# 视频演示如何用纯 CSS 创作一个渐变色动画边框
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/odpRKX 可交互视频教程 此视频 ...
- axios 各种请求方式传递参数
get delete 方法较为不同 注意:每个方法的传参格式不同,具体用法看下方 get请求方式将需要入参的数据作为 params 属性的值,最后整体作为参数传递 delete请求方式将将需要入参的数 ...
- Python---面向对象---案例
a = 5print(5/10)# 地板除(功能类似于数学模块当中floor()向下取整操作)print(5//10)print(a%10)b = 25print(b/10)print(b//10)p ...
- 如何编译Java程序以及运行程序
一.编辑运行 二.HelloWorld程序的组成: 三.public static void main(String[] args){} 四.System.out.println("Hell ...