相信很多人和我一样第一次听到反射这个词语是特别陌生的,再次之前我最熟悉的还是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给我嗯提供了四个关于反射的四个内置函数分别是:

  1. getattr
  2. setattr
  3. delattr
  4. 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”)

当然setattrdelattr,也分别是设置和删除功能。
如果你对面对对象比较熟悉的话,你就能很容易的理解到了,这里的四个函数也是可以分别对对象进行操作的。

原文链接:https://www.jianshu.com/p/f6d82f6226cf
推荐参考:https://www.jianshu.com/p/1fcea924e71f