【Python之路】特别篇--Python反射
反射
说反射之前先介绍一下__import__方法,这个和import导入模块的另一种方式
1. import commons
2. __import__('commons')
如果是多层导入:
1. from list.text import commons
2. __import__(' list.text.commons',fromlist=True) #如果不加上fromlist=True,只会导入list目录
实例:
# lib - commons.py NAME = 'Maria'
def f1():
return "F1" def f2():
return "F2" def f3():
return "F3" ****************************
# index.py moudle = __import__('lib.commons',fromlist=True) ret = moudle.f1()
print(ret)
# F1
反射即想到4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员下面逐一介绍先看例子:
moudle = __import__('lib.commons',fromlist=True) # 获取成员
ret = getattr(moudle,'f1',None) # 可以设置默认值,没找到时 ret = None
print(ret)
# <function f1 at 0x00000090548CF2F0> # 获取全局变量:
ret = getattr(dd,"NAME",None) # 检查成员
ret = hasattr(moudle,'f11') # 因为有f1方法所以返回True
print(ret) # 设置成员
setattr(moudle,"AGE",18) # 内存中创建了一个全局变量
ret = getattr(moudle,'AGE',None)
print(ret) setattr(moudle,"ADD",lambda a: a +1 ) # 内存中创建了一个函数
ret = getattr(moudle,'ADD',None)
print(ret(100)) # 删除成员
delattr(moudle,'f3')
ret = hasattr(moudle,'f3')
print(ret)
对于反射小节:
反射:
# 根据字符串的形式去某个模块中寻找东西
# 根据字符串的形式去某个模块中判断东西是否存在
# 根据字符串的形式去某个模块中设置东西
# 根据字符串的形式去某个模块中删除东西
# 根据字符串的形式去对象 (某个模块) 中操作成员 结论:
1.根据字符串的形式导入模块。
2.根据字符串的形式去对象(某个模块)中操作其成员
基于反射实现类Web框架的路由系统
实现思路:规定用户输入格式 模块名/函数名 通过__import__的形式导入模块并通过 hasattr和getattr 检查并获取函数返回值。
# lib - commons.py
def login():
return 'login' def logout():
return 'logout' ********************************
# index.py target_url = input('请输入url:')
target_module,target_func =target_url.split('/') moudle = __import__('lib.'+target_module,fromlist=True) if hasattr(moudle,target_func) == True:
func = getattr(moudle,target_func)
ret = func()
print(ret)
else :
print('404 Not Found!')
【Python之路】特别篇--Python反射的更多相关文章
- Python之路(第九篇)Python文件操作
一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r",encoding = “utf ...
- 【Python之路】特别篇--Python面向对象(进阶篇)
上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- 【Python之路】特别篇--Python面向对象(初级篇)
概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...
- python之路基础篇
基础篇 1.Python基础之初识python 2.Python数据类型之字符串 3.Python数据类型之列表 4.Python数据类型之元祖 5.Python数据类型之字典 6.Python Se ...
- python之路入门篇
一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来 ...
- python之路第一篇
一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...
- python之路第二篇(基础篇)
入门知识: 一.关于作用域: 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 10 == 10: name = 'allen' print name 以下结论对吗? ...
- 【python之路1】python安装与环境变量配置
直接搜索 Python,进入官网,找到下载,根据个人电脑操作系统下载相应的软件.小编的是windows os .下载python-2.7.9.msi 安装包 双击安装程序,进入安装步骤.在安装过程中 ...
- 【Python之路】特别篇--Python切片
字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...
随机推荐
- MFC控件使用大全
https://blog.csdn.net/daoming1112/article/details/54698113
- python基础知识0-3
一.根据用户输入内容输出其权限 # 根据用户输入内容打印其权限 # FYT --> 超级管理员 # eric --> 普通管理员 # tony,rain --> 业务主管 # ...
- Jmeter之断言(响应断言,断言持续时间)
断言是测试环节中,十分重要的一节. 响应结果是否正确,可以通过断言判断,无需人工确认. 1.为请求添加断言 常使用:响应断言>Bean Shell断言>断言持续时间 2.响应断言 ●常用来 ...
- go intall的使用
1.首先GOPATH路径指向src的上级目录 2.设置GOBIN路径指向bin目录 3.查看环境配置 4.go install 在src目录下 5.完成 6.pkg ide编译运行一下自动生成
- EXSI宿主机更换硬盘后虚机启动有问题
环境说明: 最近EXSI主机磁盘坏掉了,重新换掉磁盘以后启动虚机有问题. 虚机的报错信息如下: 找了下修复方法,操作过程为: 尝试修复 (以下是百度的方法) ls -l /dev/mapper mkd ...
- url请求
--[[local g = require 'library.global'--__ml_ss = mlc.prefix.ml_psession..tostring(os.time());local ...
- 超链接hover切换效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta na ...
- CentOS6.8安装Python3.6.3
1.linux下安装python3 准备编译环境(环境如果不对的话,可能遇到各种问题,比如wget无法下载https链接的文件) yum install zlib-devel bzip2-devel ...
- JS中有两种自加法操作
JS中有两种自加法操作.它们的运算符是++,它们的函数是向1添加运算符. 我和我的区别在于操作的顺序和组合的方向. 其中:++var被称为预自动添加,变量执行自动添加操作后.它的操作是先执行自动加法操 ...
- python之时间日期calendar
calendar是与日历相关的模块,calendar模块文件里定义了很多类型,主要有Calendar,TextCalendar以及HTMLCalendar类型.其中,Calendar是TextCale ...