https://blog.csdn.net/weixin_40025666/article/details/134456717

https://www.cnblogs.com/mengdie1978/p/17425581.html

一、反射的概念
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 = name
self.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包下面有模块email,模块email中包括了Email类,利用该类声明对象,并调用其中的send()方法。
SCSS 复制 全屏
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. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  2. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  3. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  4. 【Python】python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

  5. python 反射机制 ( 广泛应用于URL参数)

    web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...

  6. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  7. python: 反射机制;

    import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...

  8. Python 反射机制

    Python的反射机制 Python的反射机制,就是反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员 ...

  9. Python面试题之Python反射机制

    0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...

  10. Python ————反射机制

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

随机推荐

  1. 绘画应用当中的Midjourney和Diffusion有何区别?

    本文由 ChatMoney团队出品 Midjourney与Stable Diffusion:对比分析 1. 易用性与部署 Midjourney: 在线操作:Midjourney的最大优势在于其无需下载 ...

  2. 手把手 Flexbox——从零开始的奶奶级 Web 开发教程3

    上一篇讲了盒子模型,今天我们要涉及的主题是 Flexbox. 先来点顾名思义,Flex,折叠:box,盒子.可以折叠的盒子,也称作弹性盒子,就是可以根据可用的空间进行缩放的网页元素. 既然是盒子,那么 ...

  3. ZMM050N

    /********* Begin Procedure Script ************/ BEGIN var_out = with a as ( select mandt,matnr,werks ...

  4. 私域流量优化:如何利用 AIPL 模型洞察客户生命周期价值

    在当今这个数字化时代,商业战场的硝烟从未如此浓烈.随着互联网红利的逐渐消退,公域流量的成本水涨船高,企业间对于有限用户资源的争夺已进入白热化阶段.每一次点击.每一个曝光背后,都是企业不得不承担的高昂代 ...

  5. 模块与包&相对绝对路径

    [一]模块与包 (1)什么是模块 在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能. (2)模块的来源 内置的:python解释器 ...

  6. MCP 通信消息格式之 JSON-RPC 2.0 协议

    一.背景介绍 MCP 中 Client 与 Server 间使用 JSON-RPC 2.0 作为通信消息格式.JSON-RPC 是 RPC(远程过程调用)的一种具体实现,RPC 是一种通信范式,其核心 ...

  7. SQL Server 2008~2022版本序列号/密钥/激活码 汇总

    SQL Server 2008~2022版本序列号/密钥/激活码 汇总 - 重庆熊猫 - 博客园 (cnblogs.com) SQL Server 2022# Enterprise: J4V48-P8 ...

  8. NVelocity模版引擎

    NVelocity模版引擎 需要引用外部的NVelocity.dll文件 /// ///Person类 的摘要说明 /// public class Person { public Person() ...

  9. Django+DRF 实战:自定义异常处理流程

    一.DRF 异常处理流程 DRF 默认异常处理流程 DRF默认的异常处理流程如下: 当异常发生时,会自动调用rest_framework.views.exception_handler 函数来处理异常 ...

  10. RestCloud ETL 跨库数据聚合运算

    1. 在首页,进入数据源管理 2. 新增数据源,如MySQL 3. 配置数据源信息 4.测试链接.保存退出 5.回到首页,进入数据集成开发平台 6.创建新应用,编辑配置 7.进入刚刚创建的应用,左侧菜 ...