反射

说反射之前先介绍一下__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反射的更多相关文章

  1. Python之路(第九篇)Python文件操作

    一.文件的操作 文件句柄 = open('文件路径+文件名', '模式') 例子 f = open("test.txt","r",encoding = “utf ...

  2. 【Python之路】特别篇--Python面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  3. 【Python之路】特别篇--Python面向对象(初级篇)

    概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向过程编程最易被初学 ...

  4. python之路基础篇

    基础篇 1.Python基础之初识python 2.Python数据类型之字符串 3.Python数据类型之列表 4.Python数据类型之元祖 5.Python数据类型之字典 6.Python Se ...

  5. python之路入门篇

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字,来 ...

  6. python之路第一篇

    一.python环境的搭建 1.window下环境的搭建 (1).在 https://www.python.org/downloads/ 下载自己系统所需要的python版本 (2).安装python ...

  7. python之路第二篇(基础篇)

    入门知识: 一.关于作用域: 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 10 == 10: name = 'allen' print name 以下结论对吗? ...

  8. 【python之路1】python安装与环境变量配置

    直接搜索 Python,进入官网,找到下载,根据个人电脑操作系统下载相应的软件.小编的是windows os .下载python-2.7.9.msi 安装包  双击安装程序,进入安装步骤.在安装过程中 ...

  9. 【Python之路】特别篇--Python切片

    字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...

随机推荐

  1. 快速开启关闭mysql,批命令方便!

    很多python开发人员和我一样,都会在自己的电脑上配置一个python开发的环境,便于开发和学习使用,比如我现在电脑上使用的就是mysql数据库,而我的电脑配置又比较低,电脑运行起来会出现卡慢的情况 ...

  2. 【转载】Python第三方库资源

    转自:https://weibo.com/ttarticle/p/show?id=2309404129469920071093 参考:https://github.com/jobbole/awesom ...

  3. CentOS7 Python3上安装paramiko

    1. CentOS 7下安装Python3.5 CentOS7默认安装了python2.7.5,要用 Python3需要自己手动安装.注意不要删除python2. 1.1 下载python3源码包 w ...

  4. Git 学习笔记之(三)将本地工程导入到GitHub 仓库中

    一:操作步骤第一步:建立git仓库 cd到你的本地项目根目录下,执行git命令,此命令会在当前目录下创建一个.git文件夹. git init 第二步:将项目的所有文件添加到仓库中 git add . ...

  5. 解决EntityFramework与System.ComponentModel.DataAnnotations命名冲突

    比如,定义entity时指定一个外键, [ForeignKey("CustomerID")] public Customer Customer { get; set; } 编译时报 ...

  6. O042、Live Migrate 操作

    参考https://www.cnblogs.com/CloudMan6/p/5554549.html   Migrate 操作会先将Instance停掉,也就是所谓的 冷迁移 .而 Live Migr ...

  7. React学习——通过模态框中的表单,学习父子组件之间传值

    import { Button, Modal, Form, Input, Radio } from 'antd'; const CollectionCreateForm = Form.create({ ...

  8. https://bbs.ichunqiu.com/thread-48915-1-1.html

    使用BurpSuite进行双文件上传拿Webshell 首先进入网站后台:(后台界面应该是良精CMS) <ignore_js_op> 在 添加产品 这一栏有个上传文件: <ignor ...

  9. 2.Struts2-Action

    struts.xml文件中 action 标签中几个属性的作用 1.name:为action命名,输入url访问时,需要带上action的name,通过name知道访问哪个action(通过class ...

  10. VS2015 中统计整个项目的代码行数

    在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案--------------------b*[^:b#/]+.*$^b*[^:b#/]+.*$ ctrl + shif ...