首页 > 编程 > Python > 正文

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

2020-01-04 14:39:47
字体:
来源:转载
供稿:网友

本文实例讲述了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 FtpClientf1 = FtpClient('198.1.1.1')#在编写某个方法前,先判断该方法是否存在,存在就可以直接调用,不存在就要编写。if hasattr(f1,'get'):  func_get = getattr(f1,'get')  func_get()else  print('-----》不存在这个方法')  print('处理其他的逻辑')

 

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


注:相关教程知识阅读请移步到python教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表