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 应用中使用 MongoDB的方法
Jan 05 Python
Python 多线程的实例详解
Sep 07 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
Python+OpenCV实现图像融合的原理及代码
Dec 03 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
Python Pandas 如何shuffle(打乱)数据
Jul 30 Python
Python学习笔记之While循环用法分析
Aug 14 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
python使用python-pptx删除ppt某页实例
Feb 14 Python
python 实现"神经衰弱"翻牌游戏
Nov 09 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 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
实用函数4
2007/11/08 PHP
PHP初学者常见问题集合 修正版(21问答)
2010/03/23 PHP
基于flush()不能按顺序输出时的解决办法
2013/06/29 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php通过smtp邮件验证登陆的方法
2016/05/11 PHP
PHP进程通信基础之信号
2017/02/19 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
IE6-8中Date不支持toISOString的修复方法
2014/05/04 Javascript
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
jQuery选择器源码解读(六):Sizzle选择器匹配逻辑分析
2015/03/31 Javascript
jQuery自定义数值抽奖活动代码
2016/06/11 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
JS实现的合并两个有序链表算法示例
2019/02/25 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
Python实现的一个简单LRU cache
2014/09/26 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
Python中的支持向量机SVM的使用(附实例代码)
2019/06/26 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
python爬取微博评论的实例讲解
2021/01/15 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
酒店个人培训自我鉴定
2013/12/11 职场文书
综合办公室个人的自我评价
2013/12/22 职场文书
2013年学期结束动员演讲稿
2014/01/07 职场文书
十佳大学生村官事迹
2014/01/09 职场文书
司法所长先进事迹
2014/06/02 职场文书
商务专员岗位职责范本
2014/06/29 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
2016年质量月活动总结报告
2016/04/05 职场文书
环境保护宣传标语大全!
2019/06/28 职场文书