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
猜你喜欢
- 交互设计是近几年流行的一个词语。现在市场上有许多资料来介绍什么是交互设计,如何做交互设计等。从场景,任务,用户,操作等分析。但由于受实际情况
- 首先说说什么是内存泄露,在一个进程中,如果某一块内存无法访问,且直到进程结束为止也无法释放,那么就发生了内存泄露。通常这种情况发生在C++之
- 一、字符串(str)字符串转换为列表使用list()方法str_1 = "1235"str_2 = 'zhang
- 大家都知道系统存储过程是无法用工具导出的(大家可以试试 >任务>生成SQL脚本) 因为系统存储过程一般是不让开发人员修改的。 需
- asp自定义错误显示方法:<html><head><meta http-equiv="Co
- 6、遮罩滤镜作用:该滤镜可以为对象建立一个覆盖于表面的膜,其效果就象戴着有色眼镜看物体一样。语法: {filter:mask(color=c
- 今天在给一个img加链接时发现的<body> <a href="#1" >&
- 命名一直是个让我头痛的问题,特别是那些看上去差不多的模块,所以就得想办法啦,我总结了下面的方法,虽然还在试验中。希望对大家有帮助。欢迎大家提
- 前言本文介绍的主要内容是 Redux-Toolkit 在 React + TypeScript 大型应用中的实践,主要解决的问题是使用 cr
- 准备工作本文用到的表格内容如下:先来看一下原始情形:import pandas as pddf = pd.read_excel(r'
- 本文实例为大家分享了js实现全选取消效果的具体代码,供大家参考,具体内容如下<!DOCTYPE html><html la
- 获取航线信息并且制作成图航线信息航线信息查询网站本次实例使用的航班号为 CES5496查询后在network中可以寻找到如下内容https:
- <html><body><table border=1> <? $id=@mssql_connec
- 创建列表list( ) # 创造列表list(可迭代对象)# 将可迭代对象创造成列表切片索引:列表[a:b]切片索引赋值:列表[切片] =
- 首先我们介绍使用自己的数据库查询多个手机号码,那还是建议你拥有一个自己的的手机号码数据库。正常情况下,只是满足一般查询的话,你不需要去购买专
- 在python中,通过如下两个模块可以实现邮件的自动化操作smtplibemailsmtplib模块是对SMTP协议的封装,用于发送邮件;e
- 内容摘要:当我们不想让某IP服务我们的网站时,我们就要写段程序来限制IP地址。asp中如何对ip进行过滤限制?本文介绍了一种方法,这个函数只
- 先上个效果图: Sample6_1.php 中创建Form: //显示上传状态和图片 <div id="showi
- 在默认情况下,MySQL搜索不区分大小写(但某些字符集始终区分大小写,如czech)。这意味着,如果你使用col_name LIKE
- 问题你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。解决方案为了理解这个问题,先试试一个简单场景。首先,在全局命名空间