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字符串处理的七种技巧
Mar 31 Python
Python中实现switch功能实例解析
Jan 11 Python
Python OpenCV处理图像之滤镜和图像运算
Jul 10 Python
pandas 将索引值相加的方法
Nov 15 Python
使用Python将Mysql的查询数据导出到文件的方法
Feb 25 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
Jul 19 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
python中可以声明变量类型吗
Jun 18 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
Nov 25 Python
python excel和yaml文件的读取封装
Jan 12 Python
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
Jun 11 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访问数据库集群的方法小结
2016/03/14 PHP
laravel自定义分页效果
2017/07/23 PHP
PHP检查URL包含特定字符串实例方法
2019/02/11 PHP
php框架CI(codeigniter)自动加载与自主创建对象操作实例分析
2020/06/06 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
window.open()详解及浏览器兼容性问题示例探讨
2014/05/29 Javascript
Javascript writable特性介绍
2015/02/27 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
利用JavaScript为句子加标题的3种方法示例
2021/01/05 Javascript
Python logging模块学习笔记
2014/05/24 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
Python中的__init__作用是什么
2020/06/09 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
最新奶茶店创业计划书范文
2014/02/08 职场文书
总经理任命书范本
2014/06/05 职场文书
思想作风纪律整顿心得体会
2014/09/04 职场文书
关于远足的感想
2015/08/10 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
python爬虫selenium模块详解
2021/03/30 Python
SQL语句多表联合查询的方法示例
2022/04/18 MySQL
python区块链实现简版工作量证明
2022/05/25 Python