Python中getattr函数和hasattr函数作用详解


Posted in Python onJune 14, 2016

hasattr(object, name)

作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的)。

示例:

>>> hasattr(list, 'append')
True >>> hasattr(list, 'add')
False 
getattr(object,name,default):

作用:返回object的名称为name的属性的属性值,如果属性name存在,则直接返回其属性值;如果属性name不存在,则触发AttribetError异常或当可选参数default定义时返回default值。

这个方法最主要的作用是实现反射机制。也就是说可以通过字符串获取方法实例。这样,你就可以把一个类可能要调用的方法放在配置文件里,在需要的时候动态加载。

下面我们使用小例子来说明它们的用法:

import func_file #自定义python模块
cs=input('请输入要访问的URL:')
if cs=='loggin':
func_file.loggin()
if cs =='home':
func_file.home()
if cs =='':
pass#以下省略

当我定义一个自定义模块,去调用其中的方法的时候,使用if去判断时,如果模块内用很多方法,会大大影响开发的效率,代码冗余差,显然这是不可取的。下面我们使用hasattr()函数来实现我们的需求:

示例如下:

import func_file #自定义python模块,需事先存在
def run():
while True:
cs=input('请输入要访问的URL:')
#hasattr利用字符串的形式去对象(模块)中操作(寻找)成员
if hasattr(func_file,cs): #判断用户输入的URL是否在func_file模块中
func=getattr(func_file,cs) #有则将func_file模块下的cs函数赋值 
func() #等同于执行func_file模块下的cs函数
else:
print('404')#定义错误页面
run()

我们导入一个自定义模块后,gatattr可以根据输入的内容动态加载,利用hasattr()函数来判断用户输入的是否存在,不存在则调用自定义方法。

是不是感觉和我们打开网址URL很类似啊!

上一个示例有一个问题,在实际情况中,我们的功能函数可能存放在很多模块中,每一个都需要单独导入,那我们可不可以利用getattr()函数去动态加载模块呢?当然可以啦

请看示例:

def run():
while True:
cs=input('请输入:')
v,k=cs.split('/') #获得输入的模块和模块的方法
obj=__import__('lib.'+v,fromlist=True) #调用lib目录下的模块fromlist=True按路径连接的方式导入
if hasattr(obj,k):
f= getattr(obj,k)
f()
else:
print('404')
if __name__ == '__main__':
run()

是不是感到getattr很强大啊。其实,getattr()就是实现python反射的一块积木,结合其它方法如setattr(),dir() 等,我们可以还可以做出很多有趣的事情。

Python 相关文章推荐
python 根据正则表达式提取指定的内容实例详解
Dec 04 Python
python+django加载静态网页模板解析
Dec 12 Python
NumPy 如何生成多维数组的方法
Feb 05 Python
详解python多线程、锁、event事件机制的简单使用
Apr 27 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
Python骚操作之动态定义函数
Mar 26 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
使用Python串口实时显示数据并绘图的例子
Dec 26 Python
基于TensorBoard中graph模块图结构分析
Feb 15 Python
python 使用建议与技巧分享(四)
Aug 18 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
Python模块包中__init__.py文件功能分析
Jun 14 #Python
Python计算字符宽度的方法
Jun 14 #Python
Python中文分词实现方法(安装pymmseg)
Jun 14 #Python
Python找出list中最常出现元素的方法
Jun 14 #Python
Python中列表元素转为数字的方法分析
Jun 14 #Python
python实现中文转换url编码的方法
Jun 14 #Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 #Python
You might like
PHP中操作ini配置文件的方法
2013/04/25 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
HR vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
JavaScript面向对象(极简主义法minimalist approach)
2012/07/17 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
关于JavaScript对象的动态选择及遍历对象
2014/03/10 Javascript
jQuery中siblings()方法用法实例
2015/01/08 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
jQuery构造函数init参数分析续
2015/05/13 Javascript
详解Angularjs filter过滤器
2016/02/06 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
2020/04/18 Javascript
JSON键值对序列化和反序列化解析
2017/01/24 Javascript
Angular4 反向代理Details实践
2018/05/30 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
[02:11]完美世界DOTA2联赛10月28日赛事精彩集锦:来吧展示实力强劲
2020/10/29 DOTA
python实现查找两个字符串中相同字符并输出的方法
2015/07/11 Python
详解python 发送邮件实例代码
2016/12/22 Python
Python分析学校四六级过关情况
2017/11/22 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
2020/02/17 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
英国设计师珠宝网站:Joshua James Jewellery
2020/03/01 全球购物
全民健身日活动方案
2014/01/29 职场文书
违反校纪校规检讨书
2014/02/15 职场文书
英文推荐信格式范文
2014/05/09 职场文书
结对共建工作方案
2014/06/02 职场文书
交通局领导班子群众路线教育实践活动对照检查材料思想汇报
2014/10/09 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
开发者首先否认《遗弃》被取消的传言
2022/04/11 其他游戏
python神经网络ResNet50模型
2022/05/06 Python