Python反射机制理解
Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员。
- getattr(object, name)
object代表模块,name代表模块中的属性或成员,该函数表达获取object模块中的
属性或者成员。例如getattr(commons,"login")表示去commons模块里去找
login成员,而这里的login在commons模块里是一个函数名,代表着login的函数体。
- hasattr(object,name)
object代表模块,name代表模块中的属性或成员,该函数用于确认object模块中是否存在
name属性或成员,返回只为true或false,可搭配getattr(object,name)方法一起使用。
- setattr(x, y, v)
设置某个模块里的成员或属性,setattr(x, 'y', v) is equivalent to ``x.y = v''
- delattr(x, y)
删除某个模块里的成员或属性,delattr(x, 'y') is equivalent to ``del x.y''
- __import__("模块名")
与普通的import不同的是,__import__()括号里面导入的字符串格式的模块名。
练习一 : 最容易理解的网站资源调用方式:
import commons def run():
inp = input('请输入要访问的URL:')
if inp == 'login':
commons.login()
elif inp == 'logout':
commons.logout()
elif inp == 'home':
commons.home()
else:
print('')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 当用户想要访问login页面的时候,直接模拟输入login字符串,
# 调用导入的commons.login()函数即可打印输出登录页面,
# 调用导入的commons.logout()即可打印退出页面
# 依此类推...
# 但是如果一个网站有成千上万的网页的时候要写成千上万个if-elif-else吗,
# 效率太低了,这个时候就用到了下面的Python的反射。
练习二 : 借助python反射(hasattr()和getattr()方法)来调用网站资源
import commons
def run():
inp = input('请输入要访问的URL:')
if hasattr(commons,inp):
func = getattr(commons, inp)
func()
else:
print('404-页面不存在')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 该实例利用了Python反射,inp为接收用户输入字符串,类型为字符串类型
# func代表了commons模块中的login函数名。因此以上语句表达了这样的含义:
# 接收用户输入的一个字符串并赋值给变量inp,通过hasattr函数确认commons模块中
# 是否存在inp属性,如果有的话继续通过getattr()调用该函数并打印,如果没有就打印404 # 我们在浏览器上访问网站上具体某个网页的时候,URL的通常是
# 通过gehttp://www.example.com/account/login这样的结构向服务器发送get或post请求。
# 但是网站上有成千上万个功能模块或网页,而如果要向通过这种结构的URL请求资源的话,
# 就需要将网站目录结构优化一下了。如: # 目录结构优化:
# 与用户账户相关的模块都去account.py中查找,与后台管理的都去manager.py中去查找
# --根目录
# --index.py
# --account.py
# --login()
# --logout()
# --manager.py
# --order() # 要想通过account/login这种方式请求某个资源的时候就必须借助__import__("模块名")来导入模块了。
练习三 : 使用__import__()导入模块,并使用split分割模块与属性,使python反射更灵活
# __import__() 括号内应该是字符串,通过输入字符串形式的模块名就可以导入该模块了。
# obj = __import__("commons")
# obj.login() 等同与import commons , commons.login() def run():
# 以输入account/login为例(account模块中的login函数)
inp = input('请输入要访问的URL:')
# 通过split将输入inp分割成account模块和login函数,account赋值给m,login赋值给f
m , f = inp.split('/')
# 将m以字符串格式导入,并指向obj
obj = __import__(m)
# 获取到了模块与模块内的属性或函数,就可以继续借助反射来进行操作了。
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('') # 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面
if __name__ == '__main__': # 通过主函数进行调用
run()
练习四 : 导入模块不在当前路径,需要用字符串拼接成完整模块路径,并指定fromlist属性。
# 以上练习时的目录结构基本上都是在同一目录结构里的,如果需要导入的模块在某个文件夹中的时候,在使用
# __import__()导入模块的时候就需要考虑目录结构然后用字符串的拼接成完整的模块路径了,例如以下目录结构。
# 要导入的account放在了lib文件夹下。 # --根目录
# --index.py
# --lib(文件夹)
# --account.py
# --login()
# --logout()
# --manager.py
# --order() def run():
inp = input('请输入要访问的URL:')
m , f = inp.split('/')
# 要导入模块的完整路径:lib.account
# 注意:拼接后的模块路径为"lib.account",但是默认情况下python只会导入点(.)前的第一个模块,也就是lib
# 需要在括号后面加一个fromlist = True属性才可以导入完整的模块路径。
obj = __import__("lib." + m , fromlist=True)
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面
commons.py
def login():
print('登陆页面') def logout():
print('退出页面') def home():
print('主页面')
account.py
def login():
print('登陆页面') def logout():
print('退出页面')
Python反射机制理解的更多相关文章
- python反射机制深入分析
对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数
反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...
- 【Python】python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- python 反射机制 ( 广泛应用于URL参数)
web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
- python: 反射机制;
import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...
- Python 反射机制
Python的反射机制 Python的反射机制,就是反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员 ...
- Python面试题之Python反射机制
0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...
随机推荐
- PyCharm 和 IntelliJ IDEA的破解激活
本教程对jetbrains全系列可用,例如:IDEA.WebStorm.phpstorm.clion等 PyCharm激活: 方法一: server选项里边输入 http://elporfirio. ...
- ModuleNotFoundError: No module named 'win32api'
原因:缺少了win32解决: pip install pypiwin32
- 《Android进阶之光》--事件总线
No1: EventBus三要素: 1)Event:事件 2)Subscriber:事件订阅者 3)Publisher:事件发布者 No2: EventBus的4种ThreadMode(线程模型): ...
- HDU 1503【LCS】(字符串合并输出)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1503 题目大意: 给两个字符串,组成一个长度尽可能小的字符串,它包含上述两个字符串,且原字符串中的字符 ...
- js异步刷新局部页面
真不想说博客园的Markdown编辑器,我发表到我的个人博客上多好看的一篇文章,发到博客园上格式就成这个鸟样了,哎,不发现到博客首页了,就个人存个档吧 最近在做一个异步刷新页面中的局部,这样做可以防出 ...
- 进程间通信(IPC)
1.什么是进程间通信 通俗来讲,进程间通信就是:多个进程之间的数据交互 进程都有自己独立的虚拟地址空间,导致进程之间的数据交互变得十分困难,通信复杂了,但是安全性提高了: 进程间通信的本质:多个进程之 ...
- struts2标签在jsp页面中构建map集合,循环显示
<s:radio name="gender" list="{'男', '女'}"></s:radio> <s:select nam ...
- Unity Shader-后处理:Bloom全屏泛光
一.简介 今天来学习一下全屏Bloom效果,有时候也叫Glow效果,中文一般叫做“全屏泛光”,这是一种可以模拟出HDR的全屏后处理效果,但是实现原理与HDR相差很远,效果比HDR差一些,但是比HD ...
- Kubernetes中的亲和性与反亲和性
通常情况下,Pod分配到哪些Node是不需要管理员操心的,这个过程会由scheduler自动实现.但有时,我们需要指定一些调度的限制,例如某些应用应该跑在具有SSD存储的节点上,有些应用应该跑在同一个 ...
- JVM内存区域的划分(内存结构或者内存模型)
JVM内存区域的划分(内存结构或者内存模型) 运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...