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反射的更多相关文章

  1. python 反射

    python 反射的核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! 反射的四个基本函数使用 hasattr,getattr,setatt ...

  2. Python反射机制理解

    Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员. getattr(object, name) object代表模块,name代表模块中的属性或成员,该函 ...

  3. 小学生绞尽脑汁也学不会的python(反射)

    小学生绞尽脑汁也学不会的python(反射) 1. issubclass, type, isinstance issubclass 判断xxxx类是否是xxxx类的子类 type 给出xxx的数据类型 ...

  4. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  5. python反射问题

    python中的__import__是以字符串的形式反射导入模块并以字符串的形式执行函数

  6. python 反射的使用

    反射这个功能在很多编程语言中都有,在Python中自然也不例外.其实编程语言中的很多功能都能用简单的代码来验证. 在code代码之前,先简单的了解下反射的几个属性. hasattr(obj,name_ ...

  7. python 反射调用

    因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...

  8. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  9. python反射和面向对象的知识并简述基本的异常

    # 1.面向对象不是所有的情况都适用# 2.面向对象编程# a.定义类# class Foo:# def 方法1(self,bb):# b.根据类创建对象(创建) # class Person():# ...

随机推荐

  1. .net RPC框架选型

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

  2. 在线音乐网站【03】Part one 功能实现

    今天打算把网站功能的具体实现给总结一下,如果你想了解整个小项目,建议你先看看前面2篇博客. 1.在线音乐网站(1)需求和功能结构 2.在线音乐网站(2)数据库和开发环境 7.网站主要模块实现 a.在线 ...

  3. 基于DDD的.NET开发框架 - ABP的Entity设计思想

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  4. jQuery api 快速参考[转]

    选择符 匹配 * 所有元素 #id 带有给定ID的元素 element 给定类型的所有元素,比如说html标签 .class 带有给定类的所有元素 a,b 匹配a或者匹配b的元素 a b 作为a后代的 ...

  5. sql中去除重复的项

    方法一:group by  (取最小的id)select min(id) id,T from Table_1 group by T 方法二:union (不需要id)select T from Tab ...

  6. TrueSkill 原理及实现

    在电子竞技游戏中,特别是当有多名选手参加比赛的时候需要平衡队伍间的水平,让游戏比赛更加有意思.这样的一个参赛选手能力平衡系统通常包含以下三个模块: 一个包含跟踪所有玩家比赛结果,记录玩家能力的模块. ...

  7. BroadcastReceiver之(手动代码注册广播)屏幕锁屏、解锁监听、开机自启

    对于解锁和锁屏这种用的比较频繁action,谷歌做了限制,必须手动用代码注册 直接上代码:这是注册广播(手动代码注册广播接收者) public class MainActivity extends A ...

  8. 64-who 简明笔记

    显示已登录用户的信息 who [options] who am i who程序显示在本地系统上登录的用户的信息.这些信息包括每个用户的用户名.终端设备.登录时间和相应的远程主机名(如果可应用) 参数 ...

  9. Mysql 慢查询和慢查询日志分析

    众所周知,大访问量的情况下,可添加节点或改变架构可有效的缓解数据库压力,不过一切的原点,都是从单台mysql开始的.下面总结一些使用过或者研究过的经验,从配置以及调节索引的方面入手,对mysql进行一 ...

  10. 我的第一个DMZ方案实践

    方案提出的初衷:外网需要定时和不定时推送数据到内网服务器(只要求数据到达内网,没有要求直接连接到内网) 为什么不是直连到内网:每个人第一想到的是不安全,是的,没错不安全.内网的应用和外网的应用最明显的 ...