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模拟登录百度代码分享(获取百度贴吧等级)
Dec 27 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python 实现引用其他.py文件中的类和类的方法
Apr 29 Python
Python装饰器模式定义与用法分析
Aug 06 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
python字符串常用方法及文件简单读写的操作方法
Mar 04 Python
Python Celery异步任务队列使用方法解析
Aug 10 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
python字符串拼接+和join的区别详解
Dec 03 Python
python中用ggplot绘制画图实例讲解
Jan 26 Python
Python基础 括号()[]{}的详解
Nov 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
2021年最新CPU天梯图
2021/03/04 数码科技
PHP+shell实现多线程的方法
2015/07/01 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
利用jQuery简单实现产品展示图片左右滚动功能(示例代码)
2014/01/02 Javascript
jquery select 设置默认选中的示例代码
2014/02/07 Javascript
再次谈论React.js实现原生js拖拽效果引起的一系列问题
2016/04/03 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
nodejs acl的用户权限管理详解
2018/03/14 NodeJs
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
vue实现全匹配搜索列表内容
2019/09/26 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
关于Django外键赋值问题详解
2017/08/13 Python
python爬虫之urllib,伪装,超时设置,异常处理的方法
2018/12/19 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
利用HTML5中Geolocation获取地理位置调用Google Map API在Google Map上定位
2013/01/23 HTML / CSS
解释一下钝化(Swap out)
2016/12/26 面试题
实习期自我鉴定
2013/10/11 职场文书
加工操作管理制度
2014/01/19 职场文书
质量提升方案
2014/06/16 职场文书
地理科学专业自荐信
2014/09/01 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
比赛口号霸气押韵
2015/12/24 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle
VMware虚拟机安装 Windows Server 2022的详细图文教程
2022/09/23 Servers