python基础知识8:反射

反射的思想:利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。

主要操作方法:getattr、hasattr、setattr、delattr

在调用函数时,可以用f(),但不能用"f"(),因为后面一个是字符形式的;

场景设计:伪造web框架的路由系统

假设有一个commons,里面有些公共的程序:

deflogin():

print("你已经进入登陆页面!")

deflogout():

print("你已经退出了!")

defhome():

print("你已经进入网站主页面!")

另有一个index文件,需要去commons里面去执行程序:;

案例1:接受用户输入,展示相应的页面,此法比较费时费力。如果commons模块里有成百上千个函数呢,就要写n多个elif

importcommons

defrun():

inp=input("请输入要访问的页面")

ifinp=="login":

commons.login()

elifinp=="logout":

commons.logout()

elifinp =="home":

commons.home()

else:

print('404')

if__name__=='__main__':

run()

执行结果:

案例2:利用反射的思路,使用getattr,改善案例1的数据。

getattr函数的使用方法:它接收2个参数,前面的是一个对象或者模块,后面的是一个字符串。

importcommons

defrun():

inp=input("请输入要访问的页面")

func=getattr(commons,inp)

func()

if__name__=='__main__':

run()

执行结果:

:

案例3:使用hasattr先检查是否有此程序,有再去执行。

importcommons

defrun():

inp=input("请输入要访问的页面")

ifhasattr(commons,inp):

func=getattr(commons,inp)

func()

else:

print('404')

if__name__=='__main__':

run()

以字符串的方式去寻找模块

案例4:以字符串的形式去导入模块,

obi=__import__(m)

#模块的导入,也用字符控制

defrun():

inp=input("请输入要访问的页面")#输入的格式:模块/程序

m,f=inp.split('/')

obj=__import__(m)

ifhasattr(obj,f):

func=getattr(obj,f)

func()

else:

print('404')

if__name__=='__main__':

run()

具体请参考:

http://www.jb51.net/article/87479.htm

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171217G0DOTT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券