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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
Mar 13 Python
Tornado Web Server框架编写简易Python服务器
Jul 28 Python
python中join()方法介绍
Oct 11 Python
python分批定量读取文件内容,输出到不同文件中的方法
Dec 08 Python
对Python3中dict.keys()转换成list类型的方法详解
Feb 03 Python
python实现感知机线性分类模型示例代码
Jun 02 Python
python pandas时序处理相关功能详解
Jul 03 Python
使用python实现微信小程序自动签到功能
Apr 27 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
python把一个字符串切开的实例方法
Sep 27 Python
python用tkinter开发的扫雷游戏
Jun 01 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 页面执行时间计算代码
2008/12/04 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php实现求相对时间函数
2015/06/15 PHP
浅谈php(codeigniter)安全性注意事项
2017/04/06 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
javascript 多级checkbox选择效果
2009/08/20 Javascript
javascript 触发HTML元素绑定的函数
2010/09/11 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
2013/12/29 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
javascript 回调函数详解
2014/11/11 Javascript
JavaScript缓冲运动实现方法(2则示例)
2016/01/08 Javascript
Bootstrap基本组件学习笔记之列表组(11)
2016/12/07 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
详细分析JS函数去抖和节流
2017/12/05 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
Python中dictionary items()系列函数的用法实例
2014/08/21 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python二维码生成识别实例详解
2019/07/16 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
找到不普通的东西:Bonanza
2016/10/20 全球购物
如何实现jdbc性能优化
2012/07/30 面试题
网络安全方面的面试题
2015/11/04 面试题
接口的多继承会带来哪些问题
2015/08/17 面试题
应用化学专业本科生求职信
2013/09/29 职场文书
电子信息专业自荐书
2014/02/04 职场文书
逃课上网检讨书
2014/02/20 职场文书
大学生团日活动总结
2015/05/06 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
2015年小学实验室工作总结
2015/07/28 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书