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. springmvc集成shiro登录失败处理

    一般的登录流程会有:用户名不存在,密码错误,验证码错误等.. 在集成shiro后,应用程序的外部访问权限以及访问控制交给了shiro来管理. shiro提供了两个主要功能:认证(Authenticat ...

  2. HoloLens开发手记 - 测试 Testing

    测试HoloLens应用的做法和测试Windows应用很类似.所有常规的内容都应该被考虑在内(功能.互操作性.性能.安全性.可靠性等等),然而有些特性是HoloLens特有的,在PC或者手机上无法测试 ...

  3. Java:注解(元数据)

    初识Java注解 所谓的元数据是指用来描述数据的数据,可能刚听到元数据的时候你会有点陌生,其实任何一个使用过struts或者hibernate的开发人员都在不知不觉中使用元数据,更通俗一点来说元数据是 ...

  4. 用程序集编写clr表值函数:把正则表达式引入数据库中

    正则表达式非常好,但在数据库中就是没有,但可以通过程序集方式扩展 先编写一个dll,标量函数很好写,表值函数麻烦一点 下面是C#代码 using System; using System.Data; ...

  5. C++类功能扩展预留五招

    第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...

  6. android Baseadapter 和 ViewHolder的使用

    昨晚学习了徐大神的关于BaseAdapter的讲解,让我受益匪浅特来博客留下印记 说到baseadapter大家一定都不陌生,下面这张图就展示了数据.listview.baseadapter 之间的关 ...

  7. 聚类算法kmeans

    1. 聚类问题 所谓聚类问题,就是给定一个元素集合D,其中每个元素具有n个可观察属性,使用某种算法将D划分成k个子集,要求每个子集内部的元素之间相异度尽可能低,而不同子集的元素相异度尽可能高. 2. ...

  8. android 点亮屏幕与锁定屏幕

    PowerManager pm=(PowerManager) getSystemService(Context.POWER_SERVICE); //获取电源管理器对象 PowerManager.Wak ...

  9. SVN的简单使用

    鼠标右键 SVNCheckout 导出文件 如果想在文件里做修改:右击鼠标-SVN Commit 如果想添加文件:把想要添加的文件粘贴到文件夹中,鼠标右击-TortoiseSVN-add 如果想在添加 ...

  10. elasticsearch和hadoop集成,gateway.type hdfs设置

    配置elasticsearch的存储路径为hdfs需要两步,安装插件 elasticsearch-hadoop,在联网的情况下在命令窗口运行:plugin -install elasticsearch ...