python中的反射

Posted wwzhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的反射相关的知识,希望对你有一定的参考价值。

什么是反射

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

反射的四个方法

反射有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中的反射的主要内容,如果未能解决你的问题,请参考以下文章

反射机制

反射机制入门

反射机制入门

反射机制入门

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?

python之反射