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 = ...
随机推荐
- 函数 y=x^x的分析
关于函数 y=xx的分析: 由图像得,y在负无穷大到0图像处处不连续,故y的定义域为(0,正无穷大): 故该函数不就是y=e^(lnxx)吗? 1.定义域:我们变形一下,y=e^(xlnx),显然是0 ...
- MacBook快速入门
入职新美大,全面进入Mac工作环境,果断"撸起袖子加油干","浪起来,逼格提起来".顺道提一嘴,这边的兄弟们的干劲是真心足,作为一名老兵痞,必须要虚心向身边NX ...
- C# DataGridView搜索
public static bool SearchDGV(DataGridView DGV, string strTxt, bool UpSearch = true, bool Show = fals ...
- 一些日常工具集合(C++代码片段)
一些日常工具集合(C++代码片段) ——工欲善其事,必先利其器 尽管不会松松松,但是至少维持一个比较小的常数还是比较好的 在此之前依然要保证算法的正确性以及代码的可写性 本文依然会持久更新,因为一次写 ...
- 4609: [Wf2016]Branch Assignment 最短路 DP (阅读理解题)
Bzoj的翻译出锅了所以来官方题面:这个题应该是单向边而BZOJ说的是双向边,什么你WA了?谁叫你懒得看英文...... 显然我们能正向反向两遍SPFA处理出每个点到总部的距离和总部到每个点的距离.如 ...
- 洛谷 P1114 “非常男女”计划
To 洛谷.1114 “非常男女”计划 题目描述 近来,初一年的XXX小朋友致力于研究班上同学的配对问题(别想太多,仅是舞伴),通过各种推理和实验,他掌握了大量的实战经验.例如,据他观察,身高相近的人 ...
- BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...
- Android避免快速双击按钮最简单好用的方式
代码如下,直接放到工具类中即可.类可以实现Onclicklistener,然后重写onClick方法,直接将该函数写在onClick方法中即可,这样对于所有的点击事件都将生效. 避免了快速双击出现的异 ...
- [转]Vmware(vmdk)虚拟机到hyperv(vhd)虚拟机转换
Vmware(vmdk)虚拟机到hyperv(vhd)虚拟机转换 1.关闭Vmware所有虚拟机 2.合并Vmware磁盘 通常磁盘都分开储存 "C:\Program Files (x8 ...
- C++函数模版的简单使用
模版算是C++的独有特性吧,也算是C++中比较难的地方,我平时开发的时候用的非常少,或者几乎没有用到,需要模版的地方是能看懂框架中相关的代码: 模版函数相对还是很简单的,引入模版的目的在于代码的重用: ...