Python面向对象之反射/自省机制实例分析
作者:我是马克思小清新 时间:2022-07-27 06:57:53
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/qq_33531400/article/details/79908733
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
css设计的具有亲和力的表格
![](https://img.aspxhome.com/file/UploadPic/20083/16/2008316193145866s.gif)
如何使用PHP计算上一个月的今天
番茄的js表单验证类
itchat-python搭建微信机器人(附示例)
PHP中的session永不过期的解决思路及实现方法分享
根据Dreamweaver里的ToolTip代码改进的提示框
java前端javascript生成动态表格示例演示
![](https://img.aspxhome.com/file/2023/2/56142_0s.gif)
Python关于print的操作(倒计时、转圈显示、进度条)
![](https://img.aspxhome.com/file/2023/2/66282_0s.gif)
利用javaScript实现点击输入框弹出窗体选择信息
js读取图片的宽和高
一个简单的鼠标划过切换效果js源码
![](https://img.aspxhome.com/file/UploadPic/20106/21/100523-64s.jpg)
ServerXMLHTTP的超时设置(setTimeouts)参数含义
带你深入了解Access数据库的4种安全方式
浅谈LogMiner的使用方法
python中的元组与列表及元组的更改
Python个人博客程序开发实例用户验证功能
![](https://img.aspxhome.com/file/2023/2/61192_0s.png)
加快Firefox 3.5启动速度的方法
适合所有表的添加、删除、修改的函数
通过启动脚本来感受ASP的力量
关于网站导航设计的探讨
![](https://img.aspxhome.com/file/UploadPic/up/2008022813384765.gif)