反射

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

__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()

最新文章

  1. Spring+SpringMvc+Mybatis框架集成搭建教程四(项目部署及测试)
  2. 【Unity3d游戏开发】unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(转载)
  3. 突击战UVa11729Commando War
  4. Dynamic Programming
  5. python学习之——计算给出代码中注释、代码、空行的行数
  6. 使用php模拟post的几种方法
  7. mybatis使用
  8. Washing Clothes_01背包
  9. BestCoder Round #79 (div.2)
  10. let和const====均参考阮大神的es6入门
  11. css行级块级区别总结摘录
  12. 删除IE缓存中指定的文件
  13. Android UI ActionBar功能-自定义 Action Bar 样式
  14. sql中在查询语句中加判断,控制输出的内容
  15. SQLServer2012 分页语句执行分析
  16. python如何转换word格式、读取word内容、转成html
  17. dos.orm
  18. Java 自增原理
  19. 设计一款相册APP,代替系统自带的相册功能,列举主要功能
  20. Security Testing Test Scenarios

热门文章

  1. javascript常见错误
  2. IOS 中frame与bounds的区别
  3. Java各种类型占用的字节数
  4. mac jdk设置
  5. nfa转dfa,正式完成
  6. 微软测试版Visual Studio for Mac下载
  7. 24 MUST HAVE ESSENTIAL LINUX APPLICATIONS IN 2016
  8. /var/spool/postfix/maildrop小文件太多造成inode索引使用完解决
  9. Android DiffUtil
  10. MySQL 数据类型 详解 (转载)