首页 > 编程语言 >一文了解Python反射机制(很详细)

一文了解Python反射机制(很详细)

时间:2024-10-12 16:24:14浏览次数:7  
标签:反射 一文 Python self name print page def 属性

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,self,name,print,page,def,属性
From: https://www.cnblogs.com/chinasoft/p/18460767

相关文章

  • C# 使用反射机制适配多个不同供应商提供的可统一接口化的行为(方法)
    1、定义一个接口(IMedicareControlFee)定义行为;定义一个适配器(IMedicareControlFeeAdapter)可应对多厂商(多态);usingSystem;usingSystem.Diagnostics;usingSystem.IO;usingJetSun.Infrastructure;usingJetSun.Infrastructure.Services;usingMicrosoft.Practices.Unity;usi......
  • 一文弄懂 Python os.walk(),文件处理和目录遍历
    ......
  • python redis使用教程
    文章目录安装Redispython安装redis库使用Python连接Redis使用Redis实现缓存Redis中的常用缓存操作Redis缓存策略发布与订阅事务安装RedisRedisWindows最新安装教程(2024.10.10)python安装redis库pipinstallredisE:\Redis-x64-3.2.......
  • Python cachetools常用缓存算法汇总
    文章目录cachetools介绍缓存操作设置数据生存时间(TTL)自定义缓存策略缓存装饰器缓存清理cachetools超过缓存数量maxsizecachetools使用示例cachetools介绍cachetools:是一个Python第三方库,提供了多种缓存算法的实现。缓存是一种用于临时存储计算结果的技术,以......
  • 一文详述:AI 网关与 API 网关到底有什么区别?
    近年来AI发展火热,大模型已经成为推动各行各业业务创新和增长的关键力量。随之而来问题是“企业该如何安全管理和部署AI应用的挑战?”AI基础架构的设计不仅要支持现有的业务需求,还要能够适应未来技术的快速发展。在这样的背景下,AI网关的概念应运而生,AI网关在AI应用的集成、管理和......
  • python延时效果print逐个打印字符
    我想让python打印类似“正在加载。。。”,把每个句号逐个打印出来,并且它们之间的打印间隔睡眠时间0.5秒间隔实现方法:#!/bin/envpython#-*-coding:utf-8-*-importsysimporttimedefslow(msg,text):print(msg,end='')foriintext:print(i,end=''......
  • python中_init_.py 到底有啥用?
     1.__init__.py是个啥?__init__.py,这个文件名就是用来“初始化”的。在Python里,它主要用于标识一个目录是一个“包(Package)”。在项目里新建了一个文件夹,要让它成为一个可供导入的模块包,最简单的办法就是在里面加一个__init__.py。比如,咱们有个项目结构如下:my_project/......
  • Python中语法糖
    什么是语法糖?语法糖指简化语法,代码的基本逻辑没改变。语法糖代码示例squares_dict={}forxinrange(10):squares_dict[x]=x**2 列表推导简单的方式生成列表语法糖:squares_dict={x:x**2forxinrange(10)}输出:[0,1,4,9,......
  • 核密度估计 python代码
    确实,我提供的示例代码中有一些需要修正的地方。让我们逐一解决这些问题,并提供正确的核密度估计(KDE)的Python代码。使用SciPy进行核密度估计importnumpyasnpfromscipy.statsimportgaussian_kdeimportmatplotlib.pyplotasplt#生成一些随机数据data=np.random.no......
  • python基于django的贫困生资助勤工俭学管理系统
    目录技术栈具体实现截图编码规范开发技术介绍系统的稳定性和可维护性核心代码部分展示详细视频演示python大数据库爬虫题目推荐源码获取方式技术栈系统界面应简洁易懂,用户使用时一目了然,操作不应包含过多步骤或包含难以理解的操作,每个请求操作应给出成功或失败的具......