CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】
反射
反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法。
hasattr 通过字符串 判断对象的属性或者方法是否存在
getattr 通过字符串 获取对象的属性或者方法 getattr ( ref , 'z' , '没有值') 可以设置返回值,防止报错
setattr 通过字符串 设置对象的属性或者方法
delattr 通过字符串 删除对象的属性或者方法
# _*_ coding: gbk _*_
# @Author: Wonder class Reflection:
def __init__(self, x, y):
self.m = x
self.n = y ref = Reflection(1, 2)
print(hasattr(ref, 'm')) # True print(getattr(ref, 'n')) # 2 print(getattr(ref, 'z')) # AttributeError: 'Reflection' object has no attribute 'z'
print(getattr(ref, 'z', '没有值')) # 没有值 setattr(ref, 'a', [1, 2, 3])
print(getattr(ref, 'a')) # [1, 2, 3] delattr(ref, 'n')
print(getattr(ref, 'n', '么得')) # 么得
-----------------------------------------2019----11----29-----------------------------------------
类的内置方法(魔法方法)
凡是在类内部定义,以__开头,__结尾的方法,都是类的内置方法,也称为魔法方法。
类的内置方法会在满足某种条件下自动触发。
1、__new__ 和 __init__ 组合使用,完成类的实例化
__new__(cls,*args,**kwargs) 实例化对象的第一步就是先执行__new__,将类cls传进__new__,然后,必须要return一个对象,可以直接调用object.__new__生成。
__init__(self) 实例化对象的第二步,__init__收到第一步 __new__的返回值(一个对象),将其传给self。完成初始化后续操作,不需要返回值。
2、__call__ 调用 对象( ) 时触发
之前只有碰到过 类+( ) ,在进行 对象+( ) 操作时,会触发__call__,返回该方法的返回值。
在学到元类的时候,会知道 类本身也是对象,调用类生成对象(实例化)的时候也会执行__call__。
3、__getattr__ 和 __getattribute__
__getattr__ (self,item) 在对象.属性时,且属性不存在的时候触发。 在重写该方法时,在方法体内不允许再次使用【对象.不存在的属性】,否则会死循环到最大递归深度,报错。
__getattribute__(self ,item) 在对象.属性时,无论属性是否存在,都会触发此方法。 在重写该方法时,在方法体内不允许使用【对象.属性】的操作,否则会死循环到最大递归深度,报错。
前面学的 反射中 getattr( )方法的本质也是使用了该内置方法。
4、__setattr__
__setattr__(self,key,value) 当给对象的属性赋值 对象.属性 = 值 时触发。在重写该方法时,在方法体内不允许再次使用 【对象.属性 = 值】,否则会死循环到最大递归深度,报错。如果要赋值,可以通过self.__dict__[key] = value 的方式进行赋值。
5、__str__
在打印时触发该方法,重写该方法时,务必要返回一个字符串
6、__getitem__ 和 __setitem__
__getitem__ ( self ,item )在使用 self [ item] 取值的时候,触发该方法。
__setitem__( self ,item,value )在使用 self [ item ] = value 赋值的时候,触发该方法。
以上两种通过中括号取值的方式,本质上是在底层通过self.__dict__获得名称空间字典,对字典的存取操作。
最新文章
- 游戏开发工具之纹理打包器-3.使用GDI+绘图
- 循环队列+堆优化dijkstra最短路 BZOJ 4152: [AMPPZ2014]The Captain
- Android 中SimpleDateFormat的使用注意
- Linux下Date命令的用法
- HtmlEncode、HtmlDecode、UrlEncode、UrlDecode
- BIP_开发案例09_结合JavaCP通过BIP API输出报表dataprocess / rtfprocess / foprocess(案例)
- Entity Framework 6.1-Database First介绍
- Chrome浏览器扩展开发系列之四:Browser Action类型的Chrome浏览器扩展
- BZOJ_4551_[Tjoi2016&;Heoi2016]树_树剖+线段树
- module.exports与exports,export与export default之间的关系和区别
- python六十六课——单元测试(二)
- Centos&;Redhat下bcm43142博通无线网卡linux驱动之二
- P1823 [COI2007] Patrik 音乐会的等待 单调栈 洛谷luogu
- SQL2005中的事务与锁定(九)-(2)- 转载
- [GAN] How to use GAN - Meow Generator
- mybatis generator自动生成sqlmap代码的不完善之处以及解决方法
- gdb 调试(查看运行时数据) 四
- 常用到的一些js方法,记录一下
- Python从菜鸟到高手:格式化字符串
- vue dev开发环境跨域和build生产环境跨域问题解决
热门文章
- 2018年分享的Spring Cloud 2.x系列文章
- 关于linux centos7 vmware 和windows7 文件共享笔记
- div框,左右拖动
- vue 表单校验报错 ";Error: please transfer a valid prop path to form item!";
- linux IPC socket(2)
- RN 0.6以后react-navigation 导航报错null is not an object (evaluating '_RNGestureHandlerModule.default.Direction')
- php的socket编程(socket关键几个函数)
- Java-Class-@I:lombok.extern.slf4j.Slf4j
- json类型的相互转化
- MakeDown渲染出错