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 bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Python自动扫雷实现方法
Jul 25 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
python之列表推导式的用法
Nov 29 Python
python bluetooth蓝牙信息获取蓝牙设备类型的方法
Nov 29 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 Python
利用keras使用神经网络预测销量操作
Jul 07 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
教你怎么用Python操作MySql数据库
May 31 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连接Oracle数据库
2006/10/09 PHP
php文件操作之小型留言本实例
2015/06/20 PHP
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
2015/09/14 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
jQuery实现图片预加载效果
2015/11/27 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
QRCode.js:基于JQuery的生成二维码JS库的使用
2017/06/23 jQuery
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
javaScript把其它类型转换为Number类型
2019/10/13 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
微信小程序实现登录注册功能
2020/12/29 Javascript
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
Python如何基于smtplib发不同格式的邮件
2019/12/30 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
Paul’s Boutique官网:英国时尚手袋品牌
2018/03/31 全球购物
ellesse美国官方商店:意大利高级运动服品牌
2019/10/29 全球购物
如何用Lucene索引数据库
2016/02/23 面试题
制衣厂各岗位职责
2013/12/02 职场文书
小学安全教育材料
2014/02/17 职场文书
《明天,我们毕业》教学反思
2014/04/24 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
SQL Server 中的事务介绍
2022/05/20 SQL Server
win10滚动条自动往上跑怎么办?win10滚动条自动往上跑的解决方法
2022/08/05 数码科技