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使用Tkinter显示网络图片的方法
Apr 24 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
详解Python import方法引入模块的实例
Aug 02 Python
numpy向空的二维数组中添加元素的方法
Nov 01 Python
Python基础学习之类与实例基本用法与注意事项详解
Jun 17 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 Python
Python多线程爬取豆瓣影评API接口
Oct 22 Python
Python箱型图处理离群点的例子
Dec 09 Python
如何基于python实现画不同品种的樱花树
Jan 03 Python
python实现简单的五子棋游戏
Sep 01 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
比较详细PHP生成静态页面教程
2012/01/10 PHP
PHP可变函数学习小结
2015/11/29 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
jquery 弹出层实现代码
2009/10/30 Javascript
jquery蒙版控件实现代码
2010/12/08 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
火狐textarea输入法的bug的触发及解决
2013/07/24 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
Jquery实现仿京东商城省市联动菜单
2015/11/19 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
vue-router路由简单案例介绍
2017/02/21 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
python操作xml文件示例
2014/04/07 Python
python操作oracle的完整教程分享
2018/01/30 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
学校后勤人员职责
2013/12/27 职场文书
承办会议欢迎词
2014/01/17 职场文书
质检员岗位职责范本
2015/04/07 职场文书
2015年医院创卫工作总结
2015/04/22 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
python超详细实现完整学生成绩管理系统
2022/03/17 Python
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL