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中生成器和yield语句的用法详解
Apr 17 Python
Python判断列表是否已排序的各种方法及其性能分析
Jun 20 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
flask中的wtforms使用方法
Jul 21 Python
Python3爬虫学习入门教程
Dec 11 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
Python3常见函数range()用法详解
Dec 30 Python
Django密码存储策略分析
Jan 09 Python
mac使用python识别图形验证码功能
Jan 10 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
解决python 输出到csv 出现多空行的情况
Mar 24 Python
Python中使用Opencv开发停车位计数器功能
Apr 04 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 动态随机生成验证码类代码
2010/04/09 PHP
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
Javascript中正则表达式的全局匹配模式分析
2011/04/26 Javascript
那些年,我还在学习jquery 学习笔记
2012/03/05 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
vue-router:嵌套路由的使用方法
2017/02/21 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
python 读取鼠标点击坐标的实例
2018/12/29 Python
python读取并定位excel数据坐标系详解
2019/06/26 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
Python内置函数locals和globals对比
2020/04/28 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
Django websocket原理及功能实现代码
2020/11/14 Python
Python 里最强的地图绘制神器
2021/03/01 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
html5录音功能实战示例
2019/03/25 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
工程班组长岗位职责
2013/12/30 职场文书
2014年党员公开承诺书范文
2014/03/28 职场文书
调查研究项目计划书
2014/04/29 职场文书
职务任命书范本
2014/06/05 职场文书
2014年财务工作自我评价
2014/09/23 职场文书
企业党支部工作总结2015
2015/05/21 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS