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函数缺省值与引用学习笔记分享
Feb 10 Python
利用python微信库itchat实现微信自动回复功能
May 18 Python
Python构建网页爬虫原理分析
Dec 19 Python
Python 批量刷博客园访问量脚本过程解析
Aug 30 Python
python生成器推导式用法简单示例
Oct 08 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
Python 中由 yield 实现异步操作
May 04 Python
Python基于numpy模块实现回归预测
May 14 Python
PyCharm2019.3永久激活破解详细图文教程,亲测可用(不定期更新)
Oct 29 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
Jan 05 Python
Python list去重且保持原顺序不变的方法
Apr 03 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+MySQL实现的简单投票系统实例
2016/02/24 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
Javascript 对象的解释
2008/11/24 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
继续学习javascript闭包
2015/12/03 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
Vue学习笔记进阶篇之过渡状态详解
2017/07/14 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
详解jQuery中的easyui
2018/09/02 jQuery
Angular PWA使用的Demo示例
2019/01/31 Javascript
JS数组中对象去重操作示例
2019/06/04 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
Python实现文件按照日期命名的方法
2015/07/09 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
python+opencv实现动态物体追踪
2018/01/09 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
python中元组的用法整理
2020/06/15 Python
Python中Selenium模块的使用详解
2020/10/09 Python
python关于倒排列的知识点总结
2020/10/13 Python
全球性的在线购物网站:Zapals
2017/03/22 全球购物
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
报社实习生自荐信
2014/01/24 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
三下乡活动心得体会
2016/01/23 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
spring 项目实现限流方法示例
2022/07/15 Java/Android