反射

反射的作用:反射得作用是提高代码可读行。

__import__导入模块和import导入模块的区别:

__import__导入模块是通过字符串进行导入。
import是常用得导入模块方法。

扩展:

import xxx
from xxx import ooo

obj = __import__("xxx")
obj = __import__("xxx.oo.xxx",fromlist=True)

反射常用到得4个内置函数分别为:getattr、hasattr、setattr、delattr 获取成员、检查成员、设置成员、删除成员。

实例:

最初模块调用是这样得:

# commons.py

def login():
    print('炫酷的登录页面')

def logout():
    print('炫酷的退出页面')

def home():
    print('炫酷的主页面')

# index.py

import commons
def run():
    inp = input('请输入要访问的url:')
    if inp == 'login':
        commons.login()
    elif inp == 'logout':
        commons.logout()
    elif inp == 'home':
        commons.home()
    else:
        print('404')

用了反射后是这样得:

#commons.py

def login():
    print('炫酷的登录页面')

def logout():
    print('炫酷的退出页面')

def home():
    print('炫酷的主页面')

#index.py

import commons

def run():
    inp = input('请输入要访问的url:')
    # inp字符串类型 inp = "login"
    # 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员
	# delattr()
	# setattr()
    if hasattr(commons, inp):
        func = getattr(commons,inp)
        func()
    else:
        print('404')

if __name__ == '__main__':
    run()

模块也可以通过字符串进行导入:

def run():
    # account/login
    inp = input('请输入要访问的url:')
    # inp字符串类型 inp = "login"
    # 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员
    # delattr()
    # setattr()
    m, f = inp.split('/')
    obj = __import__(m)
    if hasattr(obj, f):
        func = getattr(obj,f)
        func()
    else:
        print('404')

if __name__ == '__main__':
    run()

对于反射小节:

1、根据字符串的形式导入模块。
2、根据字符串的形式去对象(某个模块)中操作其成员。

实例:伪造web框架的路由系统

def run():
    # account/login
    inp = input('请输入要访问的url:')
    # inp字符串类型 inp = "login"
    # 利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员
    # delattr()
    # setattr()
    m, f = inp.split('/')
    obj = __import__("lib." + m,fromlist=True)
    if hasattr(obj, f):
        func = getattr(obj, f)
        func()
    else:
        print('404')

if __name__ == '__main__':
    run()

Python开发【第一篇】Python基础之反射的更多相关文章

  1. Python开发 第一篇 python的前世今生

    Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...

  2. Python【第一篇】基础介绍

    一.本节主要内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc文件 数据类型初识 数据运算 表达式if ...else语 ...

  3. python开发第一篇:初识python

    一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为AB ...

  4. Python开发第一篇

    Python 是什么? 首先他可能是比较好的一个编程开发语言!

  5. Python unittest第一篇:基础入门+命令行编译

    unittest单元测试框架最初受JUnit启发,与其他语言的主要单元测试框架具有相似的风格. 它支持测试自动化,支持开启或关闭某个测试,支持结合测试.另外它可以生成各个单元测试的报告.为了实现以上功 ...

  6. MyBATIS插件原理第一篇——技术基础(反射和JDK动态代理)(转)

    在介绍MyBATIS插件原理前我们需要先学习一下一些基础的知识,否则我们是很难理解MyBATIS的运行原理和插件原理的. MyBATIS最主要的是反射和动态代理技术,让我们首先先熟悉它们. 1:Jav ...

  7. 图解Python 【第一篇】:Python基础1

    本节内容一览图 一.Python简介  Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间, ...

  8. 各位大佬Python的第一部分道基础题已经整理好了,希望大家面试的时候能用的上。

    Python的第一部分道基础题,希望大家面试的时候能用的上. 1.为什么学习Python? Python是目前市面上,我个人认为是最简洁.最优雅.最有前途.最全能的编程语言,没有之一. 2.通过什么途 ...

  9. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  10. python第一篇-------python介绍

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

随机推荐

  1. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  2. 神马小说:使用opensearch打造高性能搜索服务

    神马小说--- 使用opensearch打造高性能搜索服务 [使用背景] 神马小说是最早使用opensearch的用户,和opensearch一起成长.目前神马小说每天2亿搜索pv,1000w 用户. ...

  3. Windows环境下安装Redis

    1:首先下载redis.从下面地址下:https://github.com/MSOpenTech/redis/releases2:创建redis.conf文件:这是一个配置文件,指定了redis的监听 ...

  4. React Native学习-measure测量view的宽高值

    measure()测量是根据view标签中的ref属性,使用方法如下: measureWatermarkerImage(){ this.refs.watermarkerImage.measure((a ...

  5. 【Warshall_Floyd】

    模板: /* Problem: 任意两点间的最短路 Tips : 可以处理边时负数的情况. 判断图中是否有负圈,只需检查d[i][j]是负数的顶点i就可以. 复杂度 : O(n^3) */ #incl ...

  6. MVC Action,Service中筛选int 和list<int>

    action: public ActionResult DeleteByID(int id) { this.MessageService.DeleteMailTemplate(id); var fro ...

  7. 【CSS3】---曲线阴影翘边阴影

    效果图 代码 index <!DOCTYPE html> <html> <head> <meta charset=utf-8 /> <title& ...

  8. Java之累加和

    所谓累加算法,就是数学中数列求的算法,这都是司空见惯了的.下面我们用java求: package com.cdp.leijiahe; import java.util.Scanner; public ...

  9. MYSQL多实例配置与使用教程

    原文http://www.111cn.net/database/mysql/58651.htm 在实际的开发过程中,可能会需要在一台服务器上部署多个MYSQL实例,那建议使用MYSQL官方的解决方案 ...

  10. JqueryPagination 分页插件使用说明

    JqueryPagination是个简单轻量级的分页插件,使用起来很容易,只要初始化一个实例,并设置总数量.翻页回调函数.其它参数就可以实现无刷新分页功能了 1 首先引入相关js文件: <lin ...