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元组操作实例解析
Sep 23 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
python 实现在Excel末尾增加新行
May 02 Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 Python
Python数据分析模块pandas用法详解
Sep 04 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python对称的二叉树多种思路实现方法
Feb 28 Python
python GUI库图形界面开发之PyQt5树形结构控件QTreeWidget详细使用方法与实例
Mar 02 Python
python网络编程socket实现服务端、客户端操作详解
Mar 24 Python
Python+Kepler.gl实现时间轮播地图过程解析
Jul 20 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python通过format函数格式化显示值
Oct 17 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
Codeigniter发送邮件的方法
2015/03/19 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
2018/05/23 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
PHP实现数组根据某个字段进行水平合并,横向合并案例分析
2019/10/08 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
js和jquery实现监听键盘事件示例代码
2020/06/24 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
JavaScript数组实现数据结构中的队列与堆栈
2016/05/26 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
nodejs基础之常用工具模块util用法分析
2018/12/26 NodeJs
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
详解python Todo清单实战
2018/11/01 Python
在python2.7中用numpy.reshape 对图像进行切割的方法
2018/12/05 Python
python实现Flappy Bird源码
2018/12/24 Python
Python openpyxl读取单元格字体颜色过程解析
2019/09/03 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
Django --Xadmin 判断登录者身份实例
2020/07/03 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
Ruby如何创建一个线程
2013/03/10 面试题
节水倡议书范文
2014/04/15 职场文书
通信工程求职信
2014/07/16 职场文书
春节超市活动方案
2014/08/14 职场文书
2016中考冲刺决心书
2015/09/22 职场文书
创业计划书之服装
2019/10/07 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
MySQL如何使备份得数据保持一致
2022/05/02 MySQL
Mysql 文件配置解析介绍
2022/05/06 MySQL