1.python的反射机制是啥?

Python的反射机制,关键是运用字符串数组在目前控制模块中寻找特定的特性或方式,寻找后自行实行方式,这也是根据字符串数组的量化策略!这也是python强劲的自悟工作能力!在Django的类主视图和API开发设计中,路由器的最底层生产调度方式是根据反射机制完成的。如今大家一起来看看它的运用基本原理。

第二,搭建互联网架构的编码:

1.最先,大家建立一个views.py控制模块来完成web框架的主视图作用:

def index(): print('这也是主页面')def registe(): print('这也是注册网页')def login(): print('这也是登陆页面')

2.大家使用了一个manage.py控制模块,用以完成web框架的运行网页页面:

import viewsdef 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后端框架-java和python的区别-第1张图片3.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 . has attr(_ 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特性或方式

setattr(_ object,_ _ name,_ _ value):为创建对象的目标动态性加上特性或方式。

def study(self): print('%s已经学习培训'%self.name)class Student(): def ._init._(self,name): self.name = names1 = Student('小亮')setattr(s1,'study',study)s1.study(s1) #动态性给创建对象目标加上方式setattr(s1,'age',18)print(s1.age) #动态性给创建对象目标加上特性

四:反射机制。

在大家上边搭建的Web架构中,大家会发觉大家键入的url是主视图控制模块中的办法名。如果我们立即用键入的I字符串数组来启用相匹配的方式,会省许多事,由于假如views.py控制模块中有很多view涵数得话,就需要在manage.py中逐一分辨方式名字,十分不便,全部的方式都能够用一行getattr()轻轻松松拿下!即Django框架中类主视图API插口底端的dispatch()方式生产调度主视图涵数的反射机制,编码如下所示:

import viewsdef main(): url = input('输入您要浏览的url: ').strip() run = getattr(views, url) run()if ._name._ == '._main._': main()键入:index輸出:这也是主页面

代码设计:在上面的键入中,假如你不法键入或是传到一个没有主视图中的主视图涵数,你能出错。这时,我们可以应用hasattr()来分辨view控制模块中能否有传到的view涵数。hasattr()回到true和false:编码如下所示。

import viewsdef main(): url = input('输入您要浏览的url: ').strip() if hasattr(views,url): run = getattr(views,url) run() else: print('404')if ._name._ == '._main._': main()#那样编码就和原先的实行实际效果一模一样了

评论(0条)

刀客源码 游客评论