什么是反射
反射就是通过字符串的形式,导入模块,去模块中寻找、执行指定函数。利用字符串的形式对对象的成员进行操作,是一种基于字符串的事件驱动方式。
反射的四个方法
反射有4个方法:hasattr、getattr、setattr、delattr,常用的一般是前面两种方法。
反射实例
反射在很多地方都有用到,比如说web应用中的url路由器功能,根据用户输入的url地址,执行不同的视图函数。在views.py里面,我们简单定义了几个功能函数:
# -*- coding: utf-8 -*-
# __author = \'wwzhen\'
def login():
return "login"
def logout():
return "logout"
def index():
return "index"
我们再在main.py里面简单的起一个http服务,并获取url参数地址,并调用对应的视图函数,返回结果:
# -*- coding: utf-8 -*-
# __author = \'wwzhen\'
import http.server
from http.server import HTTPServer
from reflection.views import login, logout, index
class HttpServerRequestHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
path = self.path.lstrip("/")
print("path is : %s" % path)
# 路由跳转到对应的视图
message = ""
if path == "login":
message = login()
elif path == "logout":
message = logout()
elif path == "index":
message = index()
else:
message = "nothing"
self.send_response(200)
self.end_headers()
self.wfile.write(bytes(message, encoding="utf-8"))
return
def run():
httpd_server = HTTPServer(("127.0.0.1", 8810), HttpServerRequestHandler)
httpd_server.serve_forever()
run()
我们在浏览器中访问http://127.0.0.1:8810/login,便得到了返回的login字符串:
这样一个简单的web路由功能就实现了,根据不同的url,执行不同的函数,获得不同的页面,然而,如果views.py中有成百上千的函数,通过ifelse进行判断调用明显是不合理的。所以,利用反射,通过url地址字符串,去调用同名的函数,是一个很好的解决方法。
# -*- coding: utf-8 -*-
# __author = \'wwzhen\'
import http.server
from http.server import HTTPServer
import reflection.views as views
class HttpServerRequestHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
path = self.path.lstrip(\'/\')
print("path is : %s" % path)
# 路由跳转到对应的视图
message = ""
try:
message = getattr(views, path)()
except:
message = "nothing"
self.send_response(200)
self.end_headers()
self.wfile.write(bytes(message, encoding="utf-8"))
return
def run():
httpd_server = HTTPServer(("127.0.0.1", 8810), HttpServerRequestHandler)
httpd_server.serve_forever()
run()