Python面向对象之反射/自省机制实例分析

yipeiwu_com6年前Python基础

本文实例讲述了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\jb51PyDemo\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数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

python+matplotlib绘制饼图散点图实例代码

python+matplotlib绘制饼图散点图实例代码

本文是从matplotlib官网上摘录下来的一个实例,实现的功能是Python+matplotlib绘制自定义饼图作为散点图的标记,具体如下。 首先看下演示效果 实例代码: imp...

python获取文件版本信息、公司名和产品名的方法

本文实例讲述了python获取文件版本信息、公司名和产品名的方法,分享给大家供大家参考。具体如下: 该python代码可得到文件版本信息、公司名和产品名。其他的信息都在返回的字典中。具体...

PyQt5每天必学之拖放事件

PyQt5每天必学之拖放事件

在PyQt5教程的这一部分,我们将讨论拖放操作。 在电脑图形用户界面,拖放事件就是点击一个虚拟对象,并将其拖动到其他位置或到另一个虚拟物体的动作。在一般情况下,它可以被用于调用多种动作,...

python数据化运营的重要意义

python数据化运营 数据化运营的核心是运营,所有数据工作都是围绕运营工作链条展开的,逐步强化数据对于运营工作的驱动作用。数据化运营的价值体现在对运营的辅助、提升和优化上,甚至某些运营...

django框架之cookie/session的使用示例(小结)

一、http协议无状态问题 http协议没有提供多次请求之间的关联功能,协议的本意也并未考虑到多次请求之间的状态维持,每一次请求都被协议认为是一次性的。但在某些场景下,如一次登录多次访问...