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 OS模块常用函数说明
May 23 Python
使用Python判断质数(素数)的简单方法讲解
May 05 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
python处理Excel xlrd的简单使用
Sep 12 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Pandas 同元素多列去重的实例
Jul 03 Python
Python BS4库的安装与使用详解
Aug 08 Python
python 实现A*算法的示例代码
Aug 13 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 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
关于时间计算的结总
2006/12/06 PHP
How do I change MySQL timezone?
2008/03/26 PHP
PHP管理内存函数 memory_get_usage()使用介绍
2012/09/23 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
JS原型链怎么理解
2016/06/27 Javascript
详解能在多种前端框架下使用的表格控件
2017/01/11 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
Vue开发中遇到的跨域问题及解决方法
2020/02/11 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python中字典映射类型的学习教程
2015/08/20 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
2017/06/12 Python
Django Admin中增加导出CSV功能过程解析
2019/09/04 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
HTML5组件Canvas实现图像灰度化(步骤+实例效果)
2013/04/22 HTML / CSS
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
.NET remoting中对象激活的两种方式
2015/06/08 面试题
经理助理岗位职责
2014/03/05 职场文书
计算机毕业生自荐信范文
2014/03/23 职场文书
卫校毕业生个人自我鉴定
2014/04/28 职场文书
入党函调证明材料
2014/12/24 职场文书
家长学校教学计划
2015/01/19 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
医院岗前培训心得体会
2016/01/08 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书