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.Emailnotify包下面有模块email,模块email中包括了Email类,利用该类声明对象,并调用其中的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中的反射机制相关推荐

  1. 根据实例详解Java中的反射机制

    概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java ...

  2. java 反射机制_详解Java中的反射机制的优缺点

    一.什么是反射? 对于程序员来说,应该很少需要直接使用反射工具:之所以在语言中提供它们,是为了支持其他Java特性,比如对象序列化.Java Beans以及RMI.还有就是在很多框架中,也是应用到了反 ...

  3. python 协程可以嵌套协程吗_Python | 详解Python中的协程,为什么说它的底层是生成器?...

    今天是Python专题的第26篇文章,我们来聊聊Python当中的协程. 我们曾经在golang关于goroutine的文章当中简单介绍过协程的概念,我们再来简单review一下.协程又称为是微线程, ...

  4. [转载] python中for语句用法_详解Python中for循环的使用_python

    参考链接: 在Python中将else条件语句与for循环一起使用 这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 &q ...

  5. python操作符op_详解python中的 is 操作符

    大家可以与Java中的 == 操作符相互印证一下,加深一下对引用和对象的理解.原问题: Python为什么直接运行和在命令行运行同样语句但结果却不同,他们的缓存机制不同吗? 其实,高票答案已经说得很详 ...

  6. python的装饰器迭代器与生成器_详解python中的生成器、迭代器、闭包、装饰器

    迭代是访问集合元素的一种方式.迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 1|1可迭代对象 以直接作用于 for ...

  7. python中for语句用法_详解Python中for循环的使用_python

    这篇文章主要介绍了Python中for循环的使用,来自于IBM官方网站技术文档,需要的朋友可以参考下 for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程&q ...

  8. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  9. python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...

    文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...

最新文章

  1. fiddler+android抓包工具配置使用
  2. 快速配置Windows 2003平台下实现 IIS(WEB)站点的安全(SSL加密技术!)
  3. 数据挖掘十大算法--Apriori算法
  4. python最全知识点_史上最全的Python面向对象知识点疏理
  5. Spring AOP根据JdbcTemplate方法名动态设置数据源
  6. emd实现信息隐藏_【读书笔记】深入理解TensorFlow架构设计与实现原理(五)
  7. POJ 2823 Sliding Window
  8. 从Adobe Photoshop CC 2018的“新建Web”看Web网页常见分辨率
  9. [luogu P4198] 楼房重建(线段树 + 思维)
  10. 【HDU - 6187】Destroy Walls(思维,最大生成树)
  11. java web开发学习手册_Java 人必备学习手册开发下载!
  12. mysql实现程序的动态链接_程序的链接和装入及Linux下动态链接的实现
  13. linux apache tomcat php 共用 80,apache与tomcat共用80端口
  14. 韩国出现加密货币妈妈潮 女性对加密投资兴趣趋升
  15. 洛谷P1880 石子合并(区间DP)(环形DP)
  16. CO2 势能模型里面的 ε 的单位 理解
  17. Java——数据结构之顺序表
  18. Qt信号与槽机制详解
  19. ansi编码_刨根究底字符编码之零——前言
  20. android bugly 错误分析,Android使用bugly捕捉异常

热门文章

  1. elasticsearch学习(六):IK分词器
  2. MonoDevelop花括号(大括号)自动补全
  3. MTK 智能机平台系统文件夹文件详解
  4. android 首页广告位,Android 使用 ViewPager循环广告位的实现
  5. C语言程序设计的总结与反思
  6. Actor模型的本质
  7. Linux开发工具3
  8. [南怀瑾系列] 中国文化漫谈
  9. 红帽Rhel7.6操作系统更换成Centos7.6的操作系统
  10. CSS实现有“边框”的下三角