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使用PyGame播放Midi和Mp3文件的方法
Apr 24 Python
详解Python中类的定义与使用
Apr 11 Python
python浪漫表白源码
Apr 05 Python
Pyqt5如何让QMessageBox按钮显示中文示例代码
Apr 11 Python
Python学习笔记之集合的概念和简单使用示例
Aug 22 Python
Python实现微信机器人的方法
Sep 06 Python
python实现简易学生信息管理系统
Apr 05 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
python3 re返回形式总结
Nov 20 Python
用sleep间隔进行python反爬虫的实例讲解
Nov 30 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
Jan 30 Python
总结几个非常实用的Python库
Jun 26 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
php递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP实现HTML生成PDF文件的方法
2014/11/07 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
IE和FireFox(FF)中js和css的不同
2009/04/13 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
深入理解Java线程编程中的阻塞队列容器
2015/12/07 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
Knockoutjs 学习系列(一)ko初体验
2016/06/07 Javascript
JS实现选定指定HTML元素对象中指定文本内容功能示例
2017/02/13 Javascript
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
python使用tkinter实现简单计算器
2018/01/30 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
Python Threading 线程/互斥锁/死锁/GIL锁
2019/07/21 Python
django ajax发送post请求的两种方法
2020/01/05 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
基于python实现matlab filter函数过程详解
2020/06/08 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
采购主管岗位职责
2014/02/01 职场文书
优秀的个人求职信范文
2014/05/09 职场文书
学习张林森心得体会
2014/09/10 职场文书
大学生支教感言
2015/08/01 职场文书
SQL Server Agent 服务无法启动
2022/04/20 SQL Server