Python反射机制理解
Python反射机制用沛齐老师总结的话说就是:利用字符串的形式去对象(模块)中操作(寻找)成员。
- getattr(object, name)
object代表模块,name代表模块中的属性或成员,该函数表达获取object模块中的
属性或者成员。例如getattr(commons,"login")表示去commons模块里去找
login成员,而这里的login在commons模块里是一个函数名,代表着login的函数体。
- hasattr(object,name)
object代表模块,name代表模块中的属性或成员,该函数用于确认object模块中是否存在
name属性或成员,返回只为true或false,可搭配getattr(object,name)方法一起使用。
- setattr(x, y, v)
设置某个模块里的成员或属性,setattr(x, 'y', v) is equivalent to ``x.y = v''
- delattr(x, y)
删除某个模块里的成员或属性,delattr(x, 'y') is equivalent to ``del x.y''
- __import__("模块名")
与普通的import不同的是,__import__()括号里面导入的字符串格式的模块名。
练习一 : 最容易理解的网站资源调用方式:
import commons def run():
inp = input('请输入要访问的URL:')
if inp == 'login':
commons.login()
elif inp == 'logout':
commons.logout()
elif inp == 'home':
commons.home()
else:
print('')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 当用户想要访问login页面的时候,直接模拟输入login字符串,
# 调用导入的commons.login()函数即可打印输出登录页面,
# 调用导入的commons.logout()即可打印退出页面
# 依此类推...
# 但是如果一个网站有成千上万的网页的时候要写成千上万个if-elif-else吗,
# 效率太低了,这个时候就用到了下面的Python的反射。
练习二 : 借助python反射(hasattr()和getattr()方法)来调用网站资源
import commons
def run():
inp = input('请输入要访问的URL:')
if hasattr(commons,inp):
func = getattr(commons, inp)
func()
else:
print('404-页面不存在')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 该实例利用了Python反射,inp为接收用户输入字符串,类型为字符串类型
# func代表了commons模块中的login函数名。因此以上语句表达了这样的含义:
# 接收用户输入的一个字符串并赋值给变量inp,通过hasattr函数确认commons模块中
# 是否存在inp属性,如果有的话继续通过getattr()调用该函数并打印,如果没有就打印404 # 我们在浏览器上访问网站上具体某个网页的时候,URL的通常是
# 通过gehttp://www.example.com/account/login这样的结构向服务器发送get或post请求。
# 但是网站上有成千上万个功能模块或网页,而如果要向通过这种结构的URL请求资源的话,
# 就需要将网站目录结构优化一下了。如: # 目录结构优化:
# 与用户账户相关的模块都去account.py中查找,与后台管理的都去manager.py中去查找
# --根目录
# --index.py
# --account.py
# --login()
# --logout()
# --manager.py
# --order() # 要想通过account/login这种方式请求某个资源的时候就必须借助__import__("模块名")来导入模块了。
练习三 : 使用__import__()导入模块,并使用split分割模块与属性,使python反射更灵活
# __import__() 括号内应该是字符串,通过输入字符串形式的模块名就可以导入该模块了。
# obj = __import__("commons")
# obj.login() 等同与import commons , commons.login() def run():
# 以输入account/login为例(account模块中的login函数)
inp = input('请输入要访问的URL:')
# 通过split将输入inp分割成account模块和login函数,account赋值给m,login赋值给f
m , f = inp.split('/')
# 将m以字符串格式导入,并指向obj
obj = __import__(m)
# 获取到了模块与模块内的属性或函数,就可以继续借助反射来进行操作了。
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('') # 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面
if __name__ == '__main__': # 通过主函数进行调用
run()
练习四 : 导入模块不在当前路径,需要用字符串拼接成完整模块路径,并指定fromlist属性。
# 以上练习时的目录结构基本上都是在同一目录结构里的,如果需要导入的模块在某个文件夹中的时候,在使用
# __import__()导入模块的时候就需要考虑目录结构然后用字符串的拼接成完整的模块路径了,例如以下目录结构。
# 要导入的account放在了lib文件夹下。 # --根目录
# --index.py
# --lib(文件夹)
# --account.py
# --login()
# --logout()
# --manager.py
# --order() def run():
inp = input('请输入要访问的URL:')
m , f = inp.split('/')
# 要导入模块的完整路径:lib.account
# 注意:拼接后的模块路径为"lib.account",但是默认情况下python只会导入点(.)前的第一个模块,也就是lib
# 需要在括号后面加一个fromlist = True属性才可以导入完整的模块路径。
obj = __import__("lib." + m , fromlist=True)
if hasattr(obj,f):
func = getattr(obj,f)
func()
else:
print('')
if __name__ == '__main__': # 通过主函数进行调用
run()
# 输出结果:
# 请输入要访问的URL:account/login
# 登陆页面
commons.py
def login():
print('登陆页面') def logout():
print('退出页面') def home():
print('主页面')
account.py
def login():
print('登陆页面') def logout():
print('退出页面')
Python反射机制理解的更多相关文章
- python反射机制深入分析
对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...
- python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数
反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...
- 【Python】python 反射机制在实际的应用场景讲解
剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...
- python 反射机制 ( 广泛应用于URL参数)
web实例 考虑有这么一个场景,根据用户输入的url的不同,调用不同的函数,实现不同的操作,也就是一个url路由器的功能,这在web框架里是核心部件之一.下面有一个精简版的示例: 首先,有一个comm ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
- python: 反射机制;
import comma def run(): inp = input('请输入要调用的函数').strip(); if hasattr(comma,inp): fun = getattr(comma ...
- Python 反射机制
Python的反射机制 Python的反射机制,就是反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函数,并执行.利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员 ...
- Python面试题之Python反射机制
0x00 前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = ...
随机推荐
- ACM题目中的时间限制与内存限制 复杂度的估计
运行时限为1s,这很常见,对于该时限,我们设计的算法复杂度不能超过百万级别,即不要超过一千万.假如你的算法时间复杂度为O(n^2),则n不应该大于3000 空间限制是32MB,即你程序中申请的内存不能 ...
- mysql字符类型大小写敏感的讨论
mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 && 场景案例
上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画 ...
- 破解百度云盘MAC下载限速问题
由于电脑更新问题,所以把电脑上的所有东西清除了.突然发现自己以前的东西还都在百度云盘上,但由于MAC 下载百度云盘上的东西只有几K或者几十K,这个网速对于小文件还能忍受,但如果是大文件就无法容忍了. ...
- 17,EasyNetQ-替换EasyNetQ组件
EasyNetQ是一个由小型组件组成的库. 当你写: var bus = RabbitHutch.CreateBus("host=localhost"); ...静态方法Creat ...
- canvas学习-----画直线
画布 1.添加canvas标签 可以通过CSS或者JS来设置canvs标签的width,height;Ps: <canvas id="cvs"></canvas ...
- unity3d 给游戏添加音源 Unity3d adds a sound source to the game
unity3d 给游戏添加音源 Unity3d adds a sound source to the game 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:3131345 ...
- 潭州课堂25班:Ph201805201 爬虫高级 第七课 sclapy 框架 爬前程网 (课堂笔)
定时对该网页数据采集,所以每次只爬第一个页面就可以, 创建工程 scrapy startproject qianchen 创建运行文件 cd qianchenscrapy genspider qian ...
- linux中内存超出后可以这样
http://www.cnblogs.com/hongten/archive/2012/11/16/java_PermGen_space.html
- String literal is not properly closed by a double-quote eclipse
中文乱码, 解决方法之一就是更改工程的编码方式. 首先选择工程,右键打开property窗口,resource下的text file incoding,看看是不是选择的utf-8,如果不是的话更改为 ...