Python面向对象之反射/自省机制实例分析


Posted in Python onAugust 24, 2018

本文实例讲述了Python面向对象之反射/自省机制。分享给大家供大家参考,具体如下:

反射:程序可以访问,检测和修改它本身状态或行为的一种能力(自省)

下面就介绍四种实现自省的函数,适用于类和对象

1. 判断object中有没有一个name字符串对应的属性或者方法

hasattr(object,name)

2. 获取object中name字符串对应的属性值或者方法地址,其中default参数的作用是,在找不到属性的时候,给予调用者的提示信息。

getattr(object,name,default= None)

3. 将object中name字符串对应的属性值设置为value,这个属性可以是新增的属性。

setattr(object,name,value)

4. 删除object中name字符串对应的属性。

delattr(object,name)

四个方法的演示

class BlackMedium:
  feture = 'Ugly'
  def __init__(self,name,addr):
    self.name = name
    self.addr = addr
  def sell_house(self):
    print('%s卖房子'%(self.name))
  def rent_house(self):
    print('%s租房子'%(self.name))
b1 = BlackMedium('万成置地','天露园')
#检测是否含有某个属性
print(hasattr(b1,'name'))
print(hasattr(b1,'sell_house'))
#获取属性
temp = getattr(b1,'name')
print(temp)
func = getattr(b1,'rent_house')
func()
#getattr(b1,'aaaaaa') 获取不存在的属性,就会报错。
print(getattr(b1,'aaaaa','该属性不存在'))
#设置数据属性和方法属性
setattr(b1,'sb',True)
setattr(b1,'show_name',lambda self:self.name + 'sb')
print(b1.__dict__)
print(b1.show_name(b1))
#删除属性
delattr(b1,'addr')
delattr(b1,'show_name')
#删除不存在的属性,报错
delattr(b1,'show_name123')
print(b1.__dict__)

运行结果:

True
True
万成置地
万成置地租房子
该属性不存在
{'sb': True, 'show_name': <function <lambda> at 0x01BCA7F0>, 'name': '\xe4\xb8\x87\xe6\x88\x90\xe7\xbd\xae\xe5\x9c\xb0', 'addr': '\xe5\xa4\xa9\xe9\x9c\xb2\xe5\x9b\xad'}
万成置地sb
Traceback (most recent call last):
  File "C:\py\3waterPyDemo\src\Demo\test.py", line 37, in <module>
    delattr(b1,'show_name123')
AttributeError: BlackMedium instance has no attribute 'show_name123'

为什么用反射呢?

举例:两个程序员A,B,A在写程序用到B写的类,但是B还没有完成这个类的编写。此时就可以用到反射,完成A自己想要编写的代码。并且不影响B的后期编码。

好处:可以事先定义好接口,接口只有在被完成时,才会真正执行,实现了即插即用,也就是一种后期绑定,即先定义接口,后期在实现接口的功能。

B还没有实现的全部功能

class FtpClient:
   #ftp客户端,但是还没有实现功能
   def __init__(self,addr):
     print('正在连接服务器[%s]'%(self.addr))
     self.addr = addr

A后期的代码编写

from module import FtpClient
f1 = FtpClient('198.1.1.1')
#在编写某个方法前,先判断该方法是否存在,存在就可以直接调用,不存在就要编写。
if hasattr(f1,'get'):
  func_get = getattr(f1,'get')
  func_get()
else
  print('-----》不存在这个方法')
  print('处理其他的逻辑')

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python使用rabbitmq实现网络爬虫示例
Feb 20 Python
Python实现查看系统启动项功能示例
May 10 Python
Python函数的参数常见分类与用法实例详解
Mar 30 Python
tensorflow使用range_input_producer多线程读取数据实例
Jan 20 Python
tensorflow 实现数据类型转换
Feb 17 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
Python动态导入模块和反射机制详解
Feb 18 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python 求两个向量的顺时针夹角操作
Mar 04 Python
解决hive中导入text文件遇到的坑
Apr 07 Python
编写python程序的90条建议
Apr 14 Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 #Python
Python日志模块logging基本用法分析
Aug 23 #Python
Python多继承原理与用法示例
Aug 23 #Python
Python抽象和自定义类定义与用法示例
Aug 23 #Python
Python引用计数操作示例
Aug 23 #Python
python实现括号匹配的思路详解
Aug 23 #Python
使用Python实现一个栈判断括号是否平衡
Aug 23 #Python
You might like
加速XP搜索功能堪比vista
2007/03/22 PHP
PHP+Mysql+jQuery实现动态展示信息
2011/10/08 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
解密效果
2006/06/23 Javascript
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
javascript中的self和this用法小结
2014/02/08 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
JS嵌套函数调用上下文的问题解决
2014/03/26 Javascript
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
2016/01/27 Javascript
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
浅谈vue websocket nodeJS 进行实时通信踩到的坑
2020/09/22 NodeJs
在nodejs中创建child process的方法
2021/01/26 NodeJs
Python查找文件中包含中文的行方法
2018/12/19 Python
django 通过url实现简单的权限控制的例子
2019/08/16 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
sklearn+python:线性回归案例
2020/02/24 Python
Django models文件模型变更错误解决
2020/05/11 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
python 操作excel表格的方法
2020/12/05 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
出纳试用期自我鉴定范文
2014/09/16 职场文书
四风自我剖析材料
2014/09/30 职场文书
幼儿园工作总结2015
2015/04/01 职场文书
上课讲话检讨书范文
2015/05/07 职场文书
技能培训通讯稿
2015/07/18 职场文书
2019各种保证书范文
2019/06/24 职场文书