python中的反射

2021-03-20 15:26

阅读:378

标签:pre   解决   image   header   serve   else   方法   判断   code   

什么是反射

反射就是通过字符串的形式,导入模块,去模块中寻找、执行指定函数。利用字符串的形式对对象的成员进行操作,是一种基于字符串的事件驱动方式。

反射的四个方法

反射有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()

python中的反射

标签:pre   解决   image   header   serve   else   方法   判断   code   

原文地址:https://www.cnblogs.com/wwzhen/p/13923577.html


评论


亲,登录后才可以留言!