Python面向对象之反射/自省机制实例分析
本文深入解析Python面向对象中的反射(自省)机制,详细演示hasattr、getattr、setattr和delattr四个核心函数的用法。通过具体代码案例,展示如何动态检测、获取、设置及删除对象属性,并探讨利用反射实现接口解耦与后期绑定的实际应用场景。
本文通过具体实例,详细解析Python面向对象编程中的反射(或称自省)机制,旨在为读者提供清晰的参考与学习素材。
所谓反射,即程序具备访问、检测并修改自身状态或行为的能力,这一特性在Python中被称为自省。
接下来将重点介绍适用于类和对象的四种自省实现函数。
第一类函数用于判断指定对象中是否存在由字符串name标识的属性或方法。
hasattr(object,name)
第二类函数用于获取对象中由字符串name标识的属性值或方法引用。其中,default参数用于指定当属性不存在时返回的提示信息,避免直接报错。
getattr(object,name,default= None)
第三类函数用于将对象中由字符串name标识的属性值设置为value。需要注意的是,该操作允许动态新增原本不存在的属性。
setattr(object,name,value)
第四类函数用于删除对象中由字符串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\xe6'} 万成置地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开发的类,但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反射机制的阐述能对您的程序设计工作有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













