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基于scrapy采集数据时使用代理服务器的方法
Apr 16 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
安装python3的时候就是输入python3死活没有反应的解决方法
Jan 24 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
python实现随机漫步算法
Aug 27 Python
Python txt文件加入字典并查询的方法
Jan 15 Python
不到20行代码用Python做一个智能聊天机器人
Apr 19 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
如何使用python传入不确定个数参数
Feb 18 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
Python os库常用操作代码汇总
Nov 03 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
Nov 29 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 面试碰到过的问题 在此做下记录
2011/06/09 PHP
CentOS下PHP安装Oracle扩展
2015/02/15 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
PHP7新特性
2021/03/09 PHP
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
linux 后台运行node服务指令方法
2018/05/23 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
Vue+axios封装请求实现前后端分离
2020/10/23 Javascript
js canvas实现五子棋小游戏
2021/01/22 Javascript
[02:51]DOTA2战队出征照拍摄花絮 TI3明星化身时尚男模
2013/07/22 DOTA
[13:56]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第一场
2018/04/06 DOTA
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
使用python存储网页上的图片实例
2018/05/22 Python
Python面向对象程序设计之继承与多继承用法分析
2018/07/13 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
python 进程池pool使用详解
2020/10/15 Python
地图可视化神器kepler.gl python接口的使用方法
2020/12/22 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
Java的类可以定义为Protected或者Private得吗
2015/09/25 面试题
晚宴邀请函范文
2014/01/15 职场文书
庆七一宣传标语
2014/10/08 职场文书
质检员岗位职责
2015/02/03 职场文书
大学生英文求职信范文
2015/03/19 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
2019银行竞聘书
2019/06/21 职场文书