getattr 反射

为什么要有反射?

当在设计一个页面访问的时候,通过用户输入相应的url,进入相应的页面,在用户输入的url地址不存在的时候,返回404错误。

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

def login():print('炫酷登录页面')def logout():print('炫酷退出页面')def home():print('炫酷主页面')

commons.py

但通过以上的形式进行编写,如果一旦需要增添更多的页面的时候,代码写入的工作量就变得巨大

getattr / hasattr

通过反射即可实现更高效的代码,也是基于反射实现类Web框架的路由系统,

getattr(commons,inp) 的含义就是让getattr自己去commons模块中寻找inp输入中对应的函数,即是login就对应login,是logout就应对logout。
import commonsdef run():inp = input('请输入要访问的url:')#利用字符串的形式去对象(模块)中操作(寻找/检查)成员if hasattr(commons,inp):    #检查是否有相应的成员,如果有进行操作func = getattr(commons,inp) #操作成员
        func()else:print('404')run()

def login():print('炫酷登录页面')def logout():print('炫酷退出页面')def home():print('炫酷主页面')

commons.py

反射的4个内置函数分别为:

getattr、hasattr、setattr、delattr ,其作用为获取成员、检查成员、设置成员、删除成员

__import__()

如果不同的def函数没有集中在同一个.py文件的模块中,而是根据所能提供的不同功能,散列的分布在众多的.py文件中的时候。

我们不可能去一个一个的import xxx对众多的模块进行一一导入,这个时候我们也可以对import的导入模块的操作进行反射

即以"字符串"的形式导入模块。

def run():inp = input('请输入要访问的url:')m,f = inp.split('/')obj = __import__(m)if hasattr(obj,f):    #检查是否有相应的成员,如果有进行操作func = getattr(obj,f) #操作成员
        func()else:print('404')run()

__import__()和各.py文件之间的关系图

如果其中一个.py文件在另一个文件下目录之下就要通过fromlist = True来找到该.py文件

def run():inp = input('请输入要访问的url:')m,f = inp.split('/')obj = __import__("lib." + m, fromlist = True)    #该模块在lib文件下路径之下的时候if hasattr(obj,f):    #检查是否有相应的成员,如果有进行操作func = getattr(obj,f) #操作成员
        func()else:print('404')run()

总结:

反射的实例:伪造Web框架的路由系统

反射:基于字符串的形式去对象(模块)中操作其成员。getattr、hasattr、setattr、delattr 。

扩展:导入模块

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

转载于:https://www.cnblogs.com/evenyao/p/9190868.html

内置函数补充 之 反射相关推荐

  1. delstr函数python_python3全栈开发-内置函数补充,反射,元类,__str__,__del__,exec,type,__call__方法详解...

    一.内置函数补充 1.isinstance(obj,cls)检查是否obj是否是类 cls 的对象 classFoo(object):passobj=Foo()print(isinstance(obj ...

  2. learn_Day14 内置函数补充、反射、初识面向对象

    内置函数 __import__()用于导入模块 getattr 用于寻找模块的指定对象 a = __import__('b')  # b为模块名,b是字符串 ==>> 导入模块b并重新命名 ...

  3. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  4. python内置函数面向对象_Pyhton——面向对象进阶二:类的内置函数补充、描述符...

    Pyhton--面向对象进阶二: 一.类的内置函数补充 1.isinstance(obj,cls)--检查obj是否是该类的对象 class Hoo: def __init__(self,name,t ...

  5. 【老九学堂】【C语言进阶】内置函数补充

    原型: 用法:#include 有些编译器需要#include 功能: 改变mem_address所指内存区域的大小为newsize长度. 说明: 如果重新分配成功则返回指向被分配内存的指针,否则返回 ...

  6. Hive学习之路 (二十二)Hive 常用的内置函数(补充)

    hive 查看函数: show functions; desc functions 函数名 1.parse_url parse_url(url, partToExtract[, key]) - ext ...

  7. python一些常用函数_【python】常用的一些内置函数

    1.cmp cmp(A,B)函数,比较A,B的大小,如果A大于B,返回1,A小于B返回-1,A等于B返回0 print cmp(12,33) >>>-1 print cmp(&quo ...

  8. 函数 内置函数 动态数组 字符

    取随机数 srand(); int num = rand();//这样执行多次都是一个相同的数 如果每次都不同要每次取一个种子 所以一般与时间连用 #include<time.h> sra ...

  9. 逆袭之路——python常见内置函数、表达式【day15】

    今日内容概要 三元表达式(简化代码) 各种生成式(简化代码) 匿名函数(简化代码) 常见重要内置函数 常见内置函数补充 今日内容详细 一.三元表达式 三元表达式:         值1 if 条件 e ...

最新文章

  1. 大数据开发上岗基本要求
  2. python 函数前有一个下划线_【Python】怎么写好一个 Python 函数?
  3. java控制台输入输出总结
  4. 从零实操基于WSL2 Docker部署Asp.Net Core项目
  5. as本地仓库更改_将gitee仓库连接GitHub Desktop。新建更改仓库并上传至gitee。
  6. 如何使用CNN进行物体识别和分类_可能我们之前都想错了:CNN的图像分类策略其实出奇的简单呢!...
  7. 记得把每一次面试当做经验积累,深夜思考
  8. JS中的异步任务有哪些
  9. MybatisCodeHelperNew-2.8.1-191-201插件使用
  10. java如何脱离ide运行_如何脱离IDE使用自己的jar包?
  11. GDUFE ACM-1096
  12. Drool的global变量
  13. 人工智能基础(高中版)教材补充和资源分享之二 机器人学矩阵
  14. 用K-Means和DBSCAN算法对西瓜数据集4.0进行聚类分析
  15. 教你设置QQ空间个性签名档
  16. 数据库安全性之安全标准
  17. 《Effective STL》 读书笔记
  18. SLIC——代码、改进
  19. 门控循环单元(Gate Recurrent Unit,GRU)
  20. [LUOGU]P3400 仓鼠窝

热门文章

  1. 用matlab时提示数据写入文件期间被裁剪_用C语言简单开发学生成绩管理系统
  2. shell不允许输入空字符_shell脚本编程之控制脚本
  3. [8] ADB 查看日志
  4. 基于java银行ATM管理系统设计(含源文件)
  5. fastadmin在html中查询数据,FastAdmin模块开发快速上手
  6. Java文档阅读笔记-JPA中getOne()和findById的区别
  7. Spring Boot笔记-使用RestTemplate优雅的调用百度ORC接口
  8. Web笔记-session盗用安全问题(Spring Boot获取所有session及提高安全性)
  9. C++设计模式-单例模式理论与实例
  10. Qt工作笔记-QTabWidget插入widget(重要的是编程思想)