python反射
python反射
python的反射是基于字符串的形式去对象(模块)中操作其成员。此操作是动态的,常用于web开发中url参数中对应模块或者函数的反射。
下面开始具体说明:
- 场景需求:
我的python脚本中有一百个函数,当前端页面被访问到之后,针对特定的url 我后端有特定的函数进行处理,我该如何判断这个URL需要后端那个函数来处理呢?写if判断?别闹了。一百多个呢,那执行效率会有多慢。看下面代码:
def f1():
print("f1") def f2():
print("f2") def f3():
print("f3") res = input("请输入url: ")
if res == 'f1':
f1()
elif res == 'f2':
f2()
elif res == 'f3':
f3()
else:
print("") 执行结果:
请输入url: f1
f1 请输入url: f2
f2 请输入url: f3
f3 请输入url: adasd
404
现在是定义了3个函数,如果100个的,我得写100个if判断,那不疯了。。。
下面耍个小聪明,使用dict映射来做
def f1():
print("f1") def f2():
print("f2") def f3():
print("f3") func_map = {
'f1':f1,
'f2':f2,
'f3':f3,
}
res = input("请输入url: ") if res in func_map:
func_map[res]()
else:
print('') 输出结果: 请输入url: f1
f1 请输入url: f2
f2 请输入url: f3
f3 请输入url: asdad
404
发现还是很麻烦。字典需要写很长影射,而且后期我加一个函数,还得在字典中手动添加对应的影射关系,万一写错了。就悲催了。。。。下面反射就出来了,就可以很好解决此问题!
- 反射getattr处理
class getfunc():
def f1(self):
print("f1") def f2(self):
print("f2") def f3(self):
print("f3") res = input("请输入url: ") obj_func = getfunc()
func = getattr(obj_func,res)
func() 输出结果: 请输入url: f1
f1 请输入url: f2
f2 请输入url: f3
f3 请输入url: f4
Traceback (most recent call last):
File "反射.py", line 55, in <module>
func = getattr(obj_func,res)
AttributeError: 'getfunc' object has no attribute 'f4'
这里我们使用的是类的作法,先创建一个类,将所有函数放在类里。在调用前先实例化该类,不论类里有多少个函数,直接根据输入内容通过getattr调用类里的函数。这样后期不管添加多少函数,只要前端能调用符合要求,则都会被调到。
发现最后一个怎么报错?原来并没有匹配到f4这个函数。反射也提供了检查功能,类似于检查一个字典是否存在某个key一样。下面说明一下反射的基本操作类型
- 反射的操作类型:
- getattr() 查找
- setattr() 设置
- hasattr() 判断
- delattr() 删除
接着上面的类说明操作类型的用法:
class getfunc:
def __init__(self):
self.test = ''
def f1(self):
print("f1") def f2(self):
print("f2") def f3(self):
print("f3") foo = getfunc()
print(hasattr(foo,'f1')) 判断是否有f1
print(hasattr(foo,'f5')) 判断是否有f5 print(setattr(foo,'f5','f1')) 设置f5为f1
print(getattr(foo,'f5')) 判断是否有f5 print(delattr(foo,'test')) 删除test
print(hasattr(foo,'test')) 判断是否有test 运行结果:
True
False
None
f1
None
False
同样模块也支持动态导入,看下面说明:
- 反射模块
模块动态导入使用__import__方法
定义一个模块:fanshe
def login():
print('登录页面') def logout():
print('退出页面') def home():
print("主页面") 下面是调用代码:
inp = input("请输入url:")
m,f = inp.split('/')
try:
obj = __import__(m)
except:
print("")
sys.exit()
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print("") 执行结果: 请输入url:fanshe/login
登录页面 请输入url:fanshe/logout
退出页面 请输入url:fanshe/home
主页面
反射太强大了。
python反射的更多相关文章
- python 反射
python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...
- Python反射机制理解
Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...
- 小学生绞尽脑汁也学不会的python(反射)
小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- python反射问题
python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数
- python 反射的使用
反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...
- python 反射调用
因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...
- python反射机制深入分析
对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- python反射和面向对象的知识并简述基本的异常
# 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...
随机推荐
- java:POI导出excel
POI是一个开源项目,专用于java平台上操作MS OFFICE,企业应用开发中可用它方便导出Excel. 下面是使用示例: 1.maven中先添加依赖项 <dependency> < ...
- java: ant 脚本示例
<?xml version="1.0" encoding="UTF-8"?> <!--basedir是从build.xml所在的目录为基础算起 ...
- ubuntu13.04环境hadoop1.2.1单机模式安装
一.虚拟机上安裝ubuntun 13.04 中文版 当然,你要是习惯看英文版,也可以直接安装英文版.老老实实从官网下载安装即可,安装系统不是本文的重点.这里只提一个注意事项:新手安装前,切记断网,因为 ...
- 后缀树(BZOJ3238TLE)
#include<cstdio> #include<cstring> #define LL long long ],stt[]; LL ans; ,sidcnt,lastcre ...
- SQL语言概述
功能概述 DDL,数据库定义语言,创建,修改,删除数据库,表,视图,索引,约束条件等 DML,数据库操纵语言,对数据库中的数据进行增,删,改,查 DCL,数据库定义语言,对数据库总数据的访问设置权限 ...
- mybatis缓存学习笔记
mybatis有两级缓存机制,一级缓存默认开启,可以在手动关闭:二级缓存默认关闭,可以手动开启.一级缓存为线程内缓存,二级缓存为线程间缓存. 一提缓存,必是查询.缓存的作用就是查询快.写操作只能使得缓 ...
- JavaScript数独求解器
<html> <head> <style type="text/css"> .txt { width: 50; height: 50; back ...
- 71 fdisk-Linux 的磁盘分区表操作工具。
语法: fdisk [-l] 装置名称 选项与参数: -l :输出后面接的装置所有的分区内容.若仅有 fdisk -l 时, 则系统将会把整个系统内能够搜寻到的装置的分区均列出来. 实例 列出所有分区 ...
- clean之后R文件消失
首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误 ...
- 最完整的Elasticsearch 基础教程
翻译:潘飞(tinylambda@gmail.com) 基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Ela ...