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 = ...
随机推荐
- Redis数据结构之字符串
学习阶段分成两个部分,一个是redis客户端,一个是java客户端操作 一:在redis客户端操作 1.先删除里面的几个key 2.set与get与getset 3.数值的增减 值递增1,或者减一 如 ...
- maven添加插件,与maven打包
1.编译插件 添加编译器插件来告诉 Maven 使用哪个 JDK 版本是用来编译项目. 2.pom <plugin> <groupId>org.apache.maven.plu ...
- 029.Docker Compose部署Zabbix实战
一 前期规划 1.1 Zabbix架构图 1.2 其他规划 组件 类型 版本 备注 Zabbix Web zabbix-web-apache-mysql镜像 wordpress:latest 也可采用 ...
- Linux 程序设计1:深入浅出 Linux 共享内存
笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...
- 从源码看Spring Boot 2.0.1
Spring Boot 命名配置很少,却可以做到和其他配置复杂的框架相同的功能工作,从源码来看是怎么做到的. 我这里使用的Spring Boot版本是 2.0.1.RELEASE Spring Boo ...
- 区域生长算法 全局分类 C++ & matlab
// 注:本内容为作者原创,禁止在其他网站复述内容以及用于商业盈利,如需引用,请标明出处:https://www.cnblogs.com/lv-anchoret/ 今天我们来介绍用C++算法如何来实现 ...
- 【Java】基本I/O的学习总结
计算机I/O 理解IO先要知道计算机对数据的输入输出是怎么处理的,下面一张图可以大致理解: 可以看出所谓输入是外部数据向CPU输入,而输出是CPU将数据输出到我们可见的地方,例如文件.屏幕等.而计算机 ...
- html 音乐 QQ播放器 外链 代码 播放器 外链 代码
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha QQ播放器 外链 代码 播放器 外链 代码 ======== 歌曲链接 QQ播放器 外链 ...
- bzoj 3924 点分
感谢asm.Definer清楚明了的题解: http://www.cnblogs.com/Asm-Definer/p/4470112.html 收获: 1. 关于重心, 对于一个无向图, 我们这样给 ...
- java获取在各种编码下中文及英文的字符个数
https://blog.csdn.net/cuker919/article/details/17281691