反射最初理解1

通过字符串的形式,导入模块2

我们前面讲到的导入模块,都是import 模块名称  如:import mk   这种方式导入的3

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import mk #导入mk模块
a = mk.dlu() #运行模块里的函数
print(a) #执行函数
# 输出
# 用户登录
# None

如果模块名称是字符串类型,则无法导入模块4

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import "mk" #导入mk模块
a = mk.dlu() #运行模块里的函数
print(a) #执行函数
# 输出
#   File "H:/py/index.py", line 3
#     import "mk" #导入mk模块
#               ^
# SyntaxError: invalid syntax

所以要想模块是字符串类型导入模块,有另外的一种方式

__import__()接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称5

使用方法1:模块名称变量 = __import__("模块文件名称")

使用方法2:如果模块在多层文件夹下:模块名称变量 = __import__("模块路径到模块文件名称")

格式1:a = __import__("mk")

格式2:a = __import__("lib.ska.mk",fromlist=True)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
a.dlu() #执行模块下的dlu()函数

如果模块在多层文件夹下

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("lib.ska.mk",fromlist=True) #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
b = a.dlu()#执行函数
print(b)#打印函数返回值
# 输出
# 用户登录
# None

通过字符串的形式,去模块中寻找指定函数,或者全局变量,并执行6

getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值7

使用方法:赋值变量 = getattr(模块名称, "字符串形式函数名称或变量名称", 如果没找到默认返回值)

格式:f = getattr(a,"dlu",None)

字符串形式查找函数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""通过字符串的形式,去模块中寻找指定函数或者全局变量,并执行"""
f = getattr(a,"dlu",None) #getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值
f()

字符串形式查找全局变量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""通过字符串的形式,去模块中寻找指定函数或者全局变量,并执行"""
f = getattr(a,"ASDF",None) #getattr()内置函数,到指定模块查找指定函数或者指定全局变量,并赋值给一个变量,如果找到的是函数赋值变量加()括号等于执行函数,如果找到的是全局变量赋值变量就等于全局变量值
print(f) #打印全局变量

hasattr()内置函数,到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False7

使用方法:赋值变量 = hasattr(模块名称, "字符串形式函数名称或变量名称")

格式:f = hasattr(a,"ASDF")

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""内置函数,到指定模块查找指定函数或者指定全局变量"""
f = hasattr(a,"ASDF") #hasattr()内置函数,到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
print(f) #打印全局变量
# 输出
# True

setattr()内置函数,为模块在内存里添加全局变量或者函数8

使用方法:setattr(模块名称, "字符串形式函数名称或变量名称",全局变量值或lambda表达式)

格式:setattr(a,"MF","8796")

为模块添加全局变量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""内置函数,为模块在内存里添加全局变量或者函数"""
setattr(a,"MF","8796") #setattr()内置函数,为模块在内存里添加全局变量或者函数
g = getattr(a,"MF",None) #到模块查找到添加的MF全局变量
print(g)#打印出添加的全局变量
# 输出
# 8796

为模块添加函数

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""内置函数,为模块在内存里添加全局变量或者函数"""
setattr(a,"f1",lambda b,c: b + c) #setattr()内置函数,为模块在内存里添加全局变量或者函数
f1 = getattr(a,"f1",None) #到模块查找到添加的f1()函数
sfg = f1(1,2) #执行f1函数并传值
print(sfg)#打印出函数的执行结果
# 输出
# 3

delattr()内置函数,删除模块在内存里的函数或者全局变量9

使用方法:delattr(模块名称, "字符串形式函数名称或变量名称")

格式:delattr(a,"dlu")

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""字符串类型的模块名,导入mk模块"""
a = __import__("mk") #接收字符串类型的模块名称,到程序目录找到对应模块文件导入模块,赋值给一个变量,此变量等于重新定义模块名称
"""内置函数,删除模块在内存里的函数或者全局变量"""
b = hasattr(a,"dlu") #到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
print(b) #打印返回值True,说明模块里有dlu()函数

delattr(a,"dlu") #delattr()内置函数,删除模块在内存里的函数或者全局变量

c = hasattr(a,"dlu") #到指定模块查找指定函数或者指定全局变量,如果找到指定函数或者全局变量返回True,否则返回False
print(c) #打印返回值False,说明模块内存里已经删除了这个函数
# 输出
# True
# False

反射总结:10
根据字符串的形式去某个对象(模块)中寻找指定的函数或者全局变量
根据字符串的形式去某个对象(模块)中判断指定的函数或者全局变量是否存在
根据字符串的形式去某个对象(模块)中设置指定的全局变量或者函数
根据字符串的形式去某个对象(模块)中删除指定的函数或者全局变量

反射的意义:根据字符串的形式去对象(模块)中操作其成员11

基于反射模拟Web框架路由系统,根据用户请求的url地址后缀,获取后缀名称,到指定模块查找执行后缀对应的函数12

函数模块

#!/usr/bin/env python
# -*- coding:utf8 -*-
def shou():print("首页")def gong():print("公司简介")def chp():print("产品展示")def liou():print("留言板")

判断页面

"""根据用户请求的url地址后缀,获取后缀名称,到指定模块执行后缀对应的函数"""
url = "www.jxiou.com/liou"
a = url.split("/") #根据/分割域名字符串,返回列表
b = a[len(a)-1] #获取列表的元素个数,在索引出域名后缀from lib.ska import mk #导入模块
if hasattr(mk,b): #判断指定模块里是否有后缀函数c = getattr(mk,b) #如果有后缀函数,找到后缀函数赋值给一个变量print(c()) #执行打印后缀函数
else: #如果模块里没有后缀函数,打印404print("404")

基于反射模拟Web框架路由系统,根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,查找到指定模块下的指定函数并执行函数13

也就是根据url地址提供的模块名称和函数名称,查找到对应的模块,和模块下对应的函数执行

函数模块1

#!/usr/bin/env python
# -*- coding:utf8 -*-
def shou():print("首页")def gong():print("公司简介")def chp():print("产品展示")def liou():print("留言板")

函数模块2

#!/usr/bin/env python
# -*- coding:utf8 -*-
def hout():print("后台首页")def houd()print("后台订单")

判断页面1

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,到指定模块执下找到指定函数并执行函数"""
url = "www.jxiou.com/mk/gong"
a = url.split("/") #根据/分割域名字符串,返回列表
b = a[len(a)-1] #获取后缀函数名
c = a[len(a)-2] #获取后缀模块名

d = __import__("lib.ska.{}".format(c),fromlist=True) #根据url模块名称找到模块
if hasattr(d,b): #判断url函数在url模块里是否存在liou = getattr(d,b) #如果存在,找到函数赋值给一个变量print(liou()) #执行打印变量
else: #如果不存在404print("404")# 输出
# 公司简介
# None

判断页面2

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""根据用户请求的url地址后缀,获取后缀模块名称和后缀函数名称,到指定模块执下找到指定函数并执行函数"""
url = "www.jxiou.com/hou/houd"
a = url.split("/") #根据/分割域名字符串,返回列表
b = a[len(a)-1] #获取后缀函数名
c = a[len(a)-2] #获取后缀模块名

d = __import__("lib.ska.{}".format(c),fromlist=True) #根据url模块名称找到模块
if hasattr(d,b): #判断url函数在url模块里是否存在liou = getattr(d,b) #如果存在,找到函数赋值给一个变量print(liou()) #执行打印变量
else: #如果不存在404print("404")# 输出
# 后台订单
# None

第四十九,反射基本介绍相关推荐

  1. 四十九、HBase介绍

    传统的RDBMS关系型数据库(例如SQL)存储一定量数据时进行数据检索没有问题,可当数据量上升到非常巨大规模的数据(TB或PB)级别时,传统的RDBMS已无法支撑,这时候就需要一种新型的数据库系统更好 ...

  2. Python编程基础:第四十九节 鸭子类型Duck Typing

    第四十九节 鸭子类型Duck Typing 前言 实践 前言 本节我们一起学习一个非常有趣的知识点:鸭子类型.有这么一句话:If it walks like a duck, and it quacks ...

  3. 四十九、深入了解两个并发接口Callable和Runnable的区别

    @Author:Runsen @Date:2020/6/11 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  4. c语言头文件格式图片_阿波罗 STM32F767 开发板资料连载第四十九章 图片显示实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第四十九章 图片显示实验 ...

  5. 信息系统项目管理师必背核心考点(四十九)合同法

    科科过为您带来软考信息系统项目管理师核心重点考点(四十九)合同法,内含思维导图+真题 [信息系统项目管理师核心考点]合同法 1.要约: 一经对方承诺就成立合同,例如投标人 2.要约邀请: 邀请他人向自 ...

  6. android 仿qq相册功能,Android第四十九期 - 仿QQ空间上传功能+本地数据库存储

    最近在看撸撸代码,他自己创了一种,网上有三种,分别是OpenDroid,greenDao,sugar,Sqlite原生写法,感觉都差不多,个人使用最优的是greenDao,下面开始介绍:    1.O ...

  7. [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 【Microsoft Azure 的1024种玩法】四十九.在Azure中使用Azure VirtualMachines 搭建Microsoft SharePoint 2016

    [简介] SharePoint Server 2016 的设计.开发和测试以 Microsoft 软件即服务 (SaaS) 战略为核心.SharePoint Server 2016 广泛借鉴了该经验, ...

  9. 【正点原子FPGA连载】第四十九章OV5640摄像头HDMI灰度显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  10. 鲁迅散文——随感录四十九

    随感录四十九 凡有高等动物,倘若没有遇着意外的变故,总是从幼到壮,从壮到老,从老到死. 我们从幼到壮,既然毫不为奇的过去了:自此以后,自然也该毫不为奇的过去. 可惜有一种人,从幼到壮,居然也毫不为奇的 ...

最新文章

  1. Spring框架—体系结构
  2. 【论文学习】Fast End-to-End Trainable Guided Filter
  3. 合成资产挖矿项目 ARCx 启动流动性挖矿
  4. 专访企业QQ SaaS团队,谈企业级LNMP架构设计
  5. 算法同学从学校到实习,需要改变什么
  6. Unity 实现水纹波动效果
  7. qtreeview 点击二级节点弹出dialog_2019二级造价师开卷考?一顿操作猛如虎,一看分数59...
  8. python 爬取公众号文章_python批量爬取公众号文章
  9. 阿里云大学互联网学院欢迎你加入!
  10. 日本企业家稻盛和夫的思想智慧
  11. SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接
  12. 后勤事务繁杂低效?三步骤解决企业行政管理难题
  13. win10:强力删除文件
  14. topsis法matlab程序,TOPSIS算法(示例代码)
  15. 数据挖掘相关岗位分析及规划
  16. 张坤(帮别人名字作诗)
  17. 谷歌语音对接-GoogleAssistant-smart-home
  18. 深度学习 图像识别 三
  19. PS黄金分割工具:黄金螺旋 黄金三角 黄金比例 三分法
  20. MKD3用法之一构造虚假WIFI热点

热门文章

  1. android M权限问题
  2. Inline Hook 钩子编写技巧
  3. 6.0无法一键root吗,root一键root
  4. 如何调整图片像素大小
  5. TensorFlow练习6: 基于WiFi指纹的室内定位(autoencoder)
  6. 家庭收支记账软件 (GO语言实现)
  7. 作为程序员面试官的3点建议
  8. Linux下常见错误码
  9. 华为悦盒EC6108V9通刷固件及教程
  10. Java系统答辩提问问题_宿舍管理系统答辩问题总结