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 24 Python
Python模拟登录验证码(代码简单)
Feb 06 Python
Python使用Srapy框架爬虫模拟登陆并抓取知乎内容
Jul 02 Python
python正则分析nginx的访问日志
Jan 17 Python
Python实现修改IE注册表功能示例
May 10 Python
python钉钉机器人运维脚本监控实例
Feb 20 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
python 梯度法求解函数极值的实例
Jul 10 Python
Python爬虫爬取杭州24时温度并展示操作示例
Mar 27 Python
Python定义一个函数的方法
Jun 15 Python
几款Python编译器比较与推荐(小结)
Oct 15 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
SMARTY学习手记
2007/01/04 PHP
php出现Cannot modify header information问题的解决方法大全
2008/04/09 PHP
解析用PHP读写音频文件信息的详解(支持WMA和MP3)
2013/05/10 PHP
php自定文件保存session的方法
2014/12/10 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jQuery实现仿腾讯迷你首页选项卡效果代码
2015/09/17 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
JavaScript中的对象和原型(一)
2016/08/12 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
[01:23]一分钟告诉你 DOTA2为什么叫信仰2
2014/06/20 DOTA
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
Python实现动态图解析、合成与倒放
2018/01/18 Python
Python基于多线程实现抓取数据存入数据库的方法
2018/06/22 Python
python中使用print输出中文的方法
2018/07/16 Python
python随机数分布random测试
2018/08/27 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python适配器模式代码实现解析
2019/08/02 Python
python tkinter组件摆放方式详解
2019/09/16 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
Python flask框架端口失效解决方案
2020/06/04 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
五水共治捐款倡议书
2014/05/14 职场文书
中文专业求职信
2014/06/20 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
电影雨中的树观后感
2015/06/15 职场文书
花田少年史观后感
2015/06/16 职场文书
2015年小学远程教育工作总结
2015/07/28 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL