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里隐藏的“禅”
Jun 16 Python
Python基础入门之seed()方法的使用
May 15 Python
Python中的数据对象持久化存储模块pickle的使用示例
Mar 03 Python
解决python2.7 查询mysql时出现中文乱码
Oct 09 Python
window下eclipse安装python插件教程
Apr 24 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
Django使用httpresponse返回用户头像实例代码
Jan 26 Python
python使用Tesseract库识别验证
Mar 21 Python
Flask框架web开发之零基础入门
Dec 10 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
如何在 Matplotlib 中更改绘图背景的实现
Nov 26 Python
PyTorch的Debug指南
May 07 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
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php的dl函数用法实例
2014/11/06 PHP
PHP面向对象精要总结
2014/11/07 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
用jQuery简化JavaScript开发分析
2009/02/19 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
每天一篇javascript学习小结(RegExp对象)
2015/11/17 Javascript
BootStrap入门教程(一)之可视化布局
2016/09/19 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
详解vue表单验证组件 v-verify-plugin
2017/04/19 Javascript
详解自定义ajax支持跨域组件封装
2018/02/08 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
javascript 使用sleep函数的常见方法详解
2020/04/26 Javascript
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
Python中字典和集合学习小结
2017/07/07 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
Python实现自定义函数的5种常见形式分析
2018/06/16 Python
Python中安装easy_install的方法
2018/11/18 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
关于python中plt.hist参数的使用详解
2019/11/28 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
OpenCV读取与写入图片的实现
2020/10/13 Python
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
全球最大的瓷器、水晶和银器零售商:Replacements
2020/06/15 全球购物
教师求职推荐信范文
2013/11/20 职场文书
三年级学生期末评语
2014/12/26 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
Golang Gob编码(gob包的使用详解)
2021/05/07 Golang
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Nginx 匹配方式
2022/05/15 Servers
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android