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使用内存zipfile对象在内存中打包文件示例
Apr 30 Python
11个并不被常用但对开发非常有帮助的Python库
Mar 31 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
Python决策树分类算法学习
Dec 22 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
python实现字典嵌套列表取值
Dec 16 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
Python3 元组tuple入门基础
Feb 09 Python
Django操作session 的方法
Mar 09 Python
如何基于Python Matplotlib实现网格动画
Jul 20 Python
用python对excel查重
Dec 07 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/02/08 PHP
浅析PHP页面局部刷新功能的实现小结
2013/06/21 PHP
PHP获取数组最大值下标的方法
2015/05/12 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
jQuery 自动增长的文本输入框实现代码
2010/04/02 Javascript
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
vue二级路由设置方法
2018/02/09 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
vue实现登录、注册、退出、跳转等功能
2020/12/23 Vue.js
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
matplotlib中legend位置调整解析
2017/12/19 Python
Python基于递归实现电话号码映射功能示例
2018/04/13 Python
Ubuntu下使用python读取doc和docx文档的内容方法
2018/05/08 Python
PyQt5显示GIF图片的方法
2019/06/17 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
详解python对象之间的交互
2020/09/29 Python
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
波兰在线运动商店:YesSport
2020/07/23 全球购物
写给爸爸的道歉信
2014/01/15 职场文书
母亲节感恩寄语
2014/02/21 职场文书
岗位职责范本大全
2015/02/26 职场文书
企业宣传稿范文
2015/07/23 职场文书
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript
SQL SERVER实现连接与合并查询
2022/02/24 SQL Server