【专题】详解Python中的反射机制
Python面向对象的反射机制
- 一、反射的概念
- 二、熟悉面向对象的属性方法
- 三、面向对象的反射机制
- 四、实例应用
一、反射的概念
python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行——基于字符串的事件驱动。
二、熟悉面向对象的属性方法
hasattr(object,'attrName')
:判断该对象是否有指定名字的属性或方法,返回值是bool类型setattr(object,'attrName',value)
:给指定的对象添加属性以及属性值getattr(object,'attrName')
:获取对象指定名称的属性或方法,返回值是str类型delattr(object,'attrName')
:删除对象指定名称的属性或方法值,无返回值
class Fruit:# 构造方法def __init__(self,name,color):self.name = nameself.color = color# 类的普通方法def buy(self,price,num):print("水果的价格是:",price*num)
"""hasattr(object,'attrName'):判断该对象是否有指定名字的属性或方法,返回值是bool类型setattr(object,'attrName',value):给指定的对象添加属性以及属性值getattr(object,'attrName'):获取对象指定名称的属性或方法,返回值是str类型delattr(object,'attrName'):删除对象指定名称的属性或方法值,无返回值
"""
apple = Fruit("苹果","红色")
print(hasattr(apple,'name')) # 判断对象是否有该属性或方法
print(hasattr(apple,'buy'))# 获取对象指定的属性值
print(getattr(apple,'name'))
print(apple.name)f = getattr(apple,'buy')
f(5,10)
# 设置对象对应的属性
setattr(apple,'weight',100)# 删除对象对应的属性
delattr(apple,'name')
print(hasattr(apple,'name'))
注:getattr,hasattr,setattr,delattr对模块的修改都在内存中进行,并不会影响文件中真实内容。
三、面向对象的反射机制
需求描述:用户通过输入字符串来调用对象的对应方法,通过模拟一个服务器响应用户的请求,设置有注册页、登录页、主页、关于页以及错误页。
class WebSite:def register(self):print("欢迎来到注册页面")def login(self):print("欢迎来到登录页面")def home(self):print("欢迎进入主页")def about(self):print("关于我们")def error(self):print("404 No Found!")page = WebSite()
while True:choose = input("请输入你要进入的页面>>>")if choose == 'register':page.register()elif choose == 'login':page.login()elif choose == 'home':page.home()elif choose == 'about':page.about()else:page.error()
由于代码段对用户的请求页判断的代码块冗长,并且当新增一个网页时也要实时修改对应的主体代码,维护起来不方便。
class WebSite:def register(self):print("欢迎来到注册页面")def login(self):print("欢迎来到登录页面")def home(self):print("欢迎进入主页")def about(self):print("关于我们")def error(self):print("404 No Found!")page = WebSite()
while True:choose = input("请输入你要进入的页面>>>")# 反射机制实现上述功能,优化代码结构if hasattr(page,choose):f = getattr(page,choose)else:page.error()
通过应用面向对象操作属性的方法很好的解决了这个问题,这就是反射机制。Python面向对象中的反射:通过字符串的形式操作对象相关的属性。
四、实例应用
在正式介绍实际web开发中的应用场景之前,先来看看这样的一个模块。
# 模块:importlib
import importlib
res = 'myfile.b'
# 传入字符串路径,调用importlib类,实现 from myfile import b
ret = importlib.import_module(res)
# 该方法最小只能到.py文件名即模块
print(ret)
是的,稍微阅读一下上面的实例代码就可以知道importlib
模块的功能是:即安装字符串式的路径自动导入模块,调用importlib.import_module()
方法,但该方法的最小粒度只能达到.py文件名
即模块。
需求描述:输入多层的模块路径,自动生成对象并调用该类的方法。比如:
notify.email.Email
,notify
包下面有模块send()
方法。
import importlib
#'notify.email.Email'
path_str = input("请输入包-模块-类的字符串路径:")
module_path,class_name = path_str.rsplit('.',maxsplit=1)
# 1 利用字符串导入模块
module = importlib.import_module(module_path) # from notify import email
# 2 利用反射获取类名
cls = getattr(module,class_name) # Email、QQ、Wechat
# 3 生成类的对象
obj = cls()
# 4 直接调用send方法
obj.send()
【专题】详解Python中的反射机制相关推荐
- 根据实例详解Java中的反射机制
概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...
- java 反射机制_详解Java中的反射机制的优缺点
一.什么是反射? 对于程序员来说,应该很少需要直接使用反射工具:之所以在语言中提供它们,是为了支持其他Java特性,比如对象序列化.Java Beans以及RMI.还有就是在很多框架中,也是应用到了反 ...
- python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...
今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...
- [转载] python中for语句用法_详解Python中for循环的使用_python
参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...
- python操作符op_详解python中的 is 操作符
大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详 ...
- python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器
迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...
- python中for语句用法_详解Python中for循环的使用_python
这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...
- python操作目录_详解python中的文件与目录操作
详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...
最新文章
- fiddler+android抓包工具配置使用
- 快速配置Windows 2003平台下实现 IIS(WEB)站点的安全(SSL加密技术!)
- 数据挖掘十大算法--Apriori算法
- python最全知识点_史上最全的Python面向对象知识点疏理
- Spring AOP根据JdbcTemplate方法名动态设置数据源
- emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
- POJ 2823 Sliding Window
- 从Adobe Photoshop CC 2018的“新建Web”看Web网页常见分辨率
- [luogu P4198] 楼房重建(线段树 + 思维)
- 【HDU - 6187】Destroy Walls(思维,最大生成树)
- java web开发学习手册_Java 人必备学习手册开发下载!
- mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现
- linux apache tomcat php 共用 80,apache与tomcat共用80端口
- 韩国出现加密货币妈妈潮 女性对加密投资兴趣趋升
- 洛谷P1880 石子合并(区间DP)(环形DP)
- CO2 势能模型里面的 ε 的单位 理解
- Java——数据结构之顺序表
- Qt信号与槽机制详解
- ansi编码_刨根究底字符编码之零——前言
- android bugly 错误分析,Android使用bugly捕捉异常