百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python中的反射机制详解,web后端路由分发的实现原理

off999 2025-05-22 12:47 8 浏览 0 评论

一. 什么是python的反射机制?

python的反射机制,核心就是利用字符串去已存在的模块中找到指定的属性或方法,找到方法后自动执行,基于字符串的事件驱动!这也是python强大的自省能力!在Django的类视图 和API开发中,路由的底层dispatch方法就是利用反射机制实现的,现在就来看看它的实现原理。


二.代码搭建WEB框架:

1.首先我们先创建一个views.py模块,用于实现web框架的视图函数功能:


def index():
 print('这是主页面')


def registe():
 print('这是注册页面')


def login():
 print('这是登录页面')


2.我们创建一个manage.py模块,用于实现web框架的启动页面:

import views

def main():
 url = input('请输入要访问页面的url: ').strip()
 if url == 'index':
 views.index()
 elif url == 'login':
 views.login()
 elif url == 'registe':
 views.registe()
 else:
 print('404')

if __name__ == '__main__':
 main()


执行结果:



三. python中我们要注意的一个点:字符串与函数名调用问题

举个例子:

def func():
 print('func是函数的名字!')

a = "func"

print(a,type(a))

a是一个字符串,我们可以用func()调用函数,但是不能用字符串去掉用函数func(),“func”()这样是行不通的,但是有没有一种办法让我们直接输入的字符串去调用函数呢?python是动态语言,有很强的自省能力,自省就是面向对象的语言所写的程序在运行时,能够知道对象的类型。简单一句就是,运行时能够获知对象的类型。这里就要提到四个重要的方法:

getattr() hasattr() setattr () delattr()


1.getattr(__o,name,__default):获得对象中的方法或变量的内存地址:

class Student():
 def __init__(self,name):
 self.name = name

 def study(self):
 print('%s正在学习'%self.name)


s1 = Student('小明')

a =getattr(s1,'name') #获取name变量的内存地址
print(a) #输出:小明

b = getattr(s1,'study') #获取study的内存地址,从而可以用传入的字符串去动态的调用函数
b() #调用study()方法 输出:小明正在学习

c = getattr(s1,'age','no attribute')
print(c) #输出:no attribute。因为age属性在对象s1中没有,本应该报错,但是设置参数后找不到就报 no attribute


2.hasattr(__o,__name):判断对象中是否有这个方法或变量,返回True 或False

class Student():
 def __init__(self,name):
 self.name = name

 def study(self):
 print('%s正在学习'%self.name)

s1 = Student('小明')

print(hasattr(s1,'study')) #输出True s1实例对象有study()方法

print(hasattr(s1,'name')) #输出True s1实例对象有name属性

print(hasattr(s1,'eat')) #输出False s1实例对象没有eat属性或方法


3. setattr(__object,__name,__value):为实例化对象动态添加属性或方法

def study(self):
 print('%s正在学习'%self.name)

class Student():
 def __init__(self,name):
 self.name = name

s1 = Student('小明')

setattr(s1,'study',study)
s1.study(s1) #动态给实例化对象添加方法

setattr(s1,'age',18)
print(s1.age) #动态给实例化对象添加属性


四:反射机制

在我们上面搭建的Web框架中我们就会发现我们输入的url就是views模块中的方法名,如果我们直接用输入得我字符串去调用对应的方法就会省好大的事,因为如果views.py模块中有很多视图函数的话,我们在manage.py中就要一个一个去判断方法名,就很麻烦,所有用getattr()一行代码就可以轻松搞定了!这也就是Django框架中类视图 API接口底层dispatch()方法分发视图函数的反射机制,代码如下:

import views


def main():
 url = input('请输入要访问的url: ').strip()
 run = getattr(views, url)
 run()


if __name__ == '__main__':
 main()

输入:index
输出:这是主页面


代码优化:上面输入中,若非法输入或传入views中没有的视图函数将报错,这时我们可以用hasattr()去判断views模块中是否有传入的视图函数,hasattr()返回True,False:代码如下

import views

def main():
 url = input('请输入要访问的url: ').strip()
 if hasattr(views,url):
 run = getattr(views,url)
 run()
 else:
 print('404')

if __name__ == '__main__':
 main()

#这样代码就和原来的执行效果一模一样了


相关推荐

python3多进程的大数据处理应用场景示例

多进程的大数据处理可以应用于以下场景:大规模数据的分块处理:importmultiprocessingdefprocess_chunk(chunk):#对数据块进行处理操作...

值得学习练手的100个Python项目(附代码),真的太实用了

Python丰富的开发生态是它的一大优势,各种第三方库、框架和代码,都是前人造好的“轮子”,能够完成很多操作,让你的开发事半功倍。在科技飞速发展的当今时代,Python以其简洁、高效和强大的功能,成...

python匿名函数lambda的语法特点和应用场景

在Python的编程过程中,有时我们会碰到一些很简单的计算,但是感觉专门为这个计算创建个函数又觉得太小题大做,这时就可以用到lambda表达式。lambda是用于创建匿名函数,也就是没有具体名称的函...

Waitress,一个神奇的python库!

基本介绍WaitressWaitress是一个纯Python写的WSGI服务器,适用于开发与部署。它简单易用,能够满足基本的Web服务需求,并且具有较好的性能。特性简单性:易于配置和使用。可靠性:稳定...

Python 中的三个不寻常的事情 柯里化、海象和 Interning

柯里化柯里化是指不是一次性给函数所有参数,而是逐个给出。因此,每次都会创建一个新的函数。让我们看看Python中的快速手动实现defadd_curried(x):definner(y)...

带你使用Python在两类场景下自动采集日志数据(附程序)

各位同学,大家好。采集日志数据是重要的数据来源。本次课程教大家使用Python技术从Windows和Linux两个环境去自动采集日志数据,轻松应对各类日志采集需求。01Python实时采集本地文件数...

python多进程的分布式任务调度应用场景及示例

多进程的分布式任务调度可以应用于以下场景:分布式爬虫:importmultiprocessingimportrequestsdefcrawl(url):response=re...

Python自动化操控术:PyAutoGUI全场景实战指南

一、PyAutoGUI核心武器库解析1.1鼠标操控三剑客importpyautogui#绝对坐标移动(闪电速度)pyautogui.moveTo(100,200,duration=0....

python学习——031编程中需要定义函数的几种场景

在编程里,当出现下面几种情形时,定义函数是非常有必要的:代码复用当某段代码在程序里要多次使用时,把它定义成函数,能避免代码重复。这样既让代码更加简洁,也方便维护。比如在一个计算多个数字的平方和的程序中...

如何在python中开发桌面应用程序?请看文章

常用的工具和框架1.TkinterTkinter是Python的标准GUI库,适合简单的桌面应用。importtkinterastkdefon_button_click():label.co...

Python多进程与多线程应用场景对比

在Python中,多进程(Multiprocessing)和多线程(Multithreading)的选择取决于任务类型(I/O密集型vsCPU密集型)、Python的GIL限制以及并...

Python 集合的应用场景

Python集合的应用场景包括:去重:集合中的元素都是唯一的,可以用于去除列表或其他可迭代对象中的重复项。成员检查:可以快速地判断一个元素是否在集合中,这比在列表或其他可迭代对象中搜索要高效。数学操作...

Python缓存应用场景与实现分析

在Python开发中,缓存是优化性能的重要手段。以下是对缓存应用场景、实现方式及常见问题的系统分析:一、缓存应用场景计算密集型函数结果缓存O示例:递归计算斐波那契数列、复杂数学运算。O优势:避免重...

Python 从入门到精通:一个月就够了

要知道,一个月是一段很长的时间。如果每天坚持用6-7小时来做一件事,你会有意想不到的收获。作为初学者,第一个月的月目标应该是这样的:熟悉基本概念(变量,条件,列表,循环,函数)练习超过30个编...

Python 编程算法级优化

大家好,我是ICodeWR。今天要记录的是Python编程算法级优化相关知识。1空间换时间经典案例1.1预计算加速三角函数importmathimportnumpyasnp#传...

取消回复欢迎 发表评论: