python3中的反射详解
相信很多人和我一样第一次听到反射
这个词语是特别陌生的,再次之前我最熟悉的还是c语言,但是在c语言中并没有反射这种机制。
c++中原生并不支持反射机制,但是Java中是支持的。在高级的Python中当然也是支持的。
什么是反射?
说到反射,我并不想用很多专业晦涩难懂的词语,因为也不是很懂害怕出错,如果那里有错还请指正。
相信我们是经常使用浏览器的,在使用浏览器的时候最重要的也不就是输入网址了,在浏览器的地址栏中输入对应的网址,对应的网站也就会有反应,并给你返回对应的网页。首相我们要知道,我们输入到浏览器地址栏的url
是一个字符串,这个字符串的url
到web服务器上后是怎么找到对应的代码函数并执行后给我们返回内容的。
比如:现在我们有这样一个需求,已知有三个函数fun1
, fun2
, fun3
这三个函数,我们都找到如果我们想调用其中某个函数的时候,我们就只有在代码中写好,比如我写了一个这样的代码来实现这个功能:
首先在文件项目下创建两个文件:test.py
, s.py
这两个python文件
s.py
,代码如下:
def fun2():
return "fun2"
def fun1():
return ‘fun1’
def fun3():
return ‘fun3’
test.py
,代码如下:
import s #导入s.py文件。
call_str = input(“input which function you want to call :”)
if call_str == ‘fun1’:
print(s.fun1())
elif call_str == ‘fun2’:
print(s.fun2())
elif call_str == ‘fun3’:
print(s.fun3())
else:
print(“404 not Found”)
运行文件test.py
后输入对应的函数名就可以调用相应的函数了。如果在s.py
文件中,有上千个函数呢!岂不是我想像以上方式调用的时候得写上千个判断语句,这样是不是太麻烦了。
所以python给我们提供了强大的反射机制,这个反射机制是通过字符串返回映射到代码中的一种机制
。
这便是反射的意思了,如果你还不是很明白还可以继续百度,参考其他的写的文章了。
python怎样使用反射
首先,python给我嗯提供了四个关于反射的四个内置函数分别是:
getattr
setattr
delattr
hasattr
下面我们简单的学习下这四个函数的有关用法:
在上面我是用if判断语句来实现函数的调用,这里我使用getattr
的方法来调用,在test.py
中增加代码如下:
import s
call_str = input(“input which function you want to call :”)
if call_str == ‘fun1’:
print(s.fun1())
elif call_str == ‘fun2’:
print(s.fun2())
elif call_str == ‘fun3’:
print(s.fun3())
else:
print(“404 not Found”)
obj = getattr(s, call_str) # 其中的s是值的带入的s文件,s也可以换为其他的你想倒入的模块等
print(obj())
运行后我们输入 fun1
, fun2
, fun3
都没有问题,但是当我们乱输入一个字符串的时候getattr
内置函数就报如下的错误:
module 's' has no attribute 'asf'
怎么解决这个问题呢?我们就可以使用hasattr
这一个内置函数了:
import s
call_str = input(“input which function you want to call :”)
if call_str == ‘fun1’:
print(s.fun1())
elif call_str == ‘fun2’:
print(s.fun2())
elif call_str == ‘fun3’:
print(s.fun3())
else:
print(“404 not Found”)
if hasattr(s, call_str): # 判断是否存在函数 call_str,这样处理就不会报错了。
obj = getattr(s, call_str)
print(obj())
else:
print(“404 not Found”)
当然setattr
和delattr
,也分别是设置和删除功能。
如果你对面对对象比较熟悉的话,你就能很容易的理解到了,这里的四个函数也是可以分别对对象进行操作的。
原文链接:https://www.jianshu.com/p/f6d82f6226cf
推荐参考:https://www.jianshu.com/p/1fcea924e71f