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 23 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python调用百度地图WEB服务API获取地点对应坐标值
Jan 16 Python
Python闭包和装饰器用法实例详解
May 22 Python
Python生成一个迭代器的实操方法
Jun 18 Python
python线程中的同步问题及解决方法
Aug 29 Python
python日期与时间戳的各种转换示例
Feb 12 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
python飞机大战游戏实例讲解
Dec 04 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
python switch 实现多分支选择功能
Dec 21 Python
Pygame如何使用精灵和碰撞检测
Nov 17 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中的类-什么叫类
2006/11/20 PHP
初级的用php写的采集程序
2007/03/16 PHP
56.com视频采集接口程序(PHP)
2007/09/22 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
ThinkPHP模版引擎之变量输出详解
2014/12/05 PHP
php构造函数与析构函数
2016/04/23 PHP
PHP+MySql+jQuery实现的"顶"和"踩"投票功能
2016/05/21 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
PHP面向对象程序设计(OOP)之方法重写(override)操作示例
2018/12/21 PHP
Laravel框架查询构造器简单示例
2019/05/08 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
jquery ui dialog ie8出现滚动条的解决方法
2010/12/06 Javascript
JS求平均值的小例子
2013/11/29 Javascript
JS中表单的使用小结
2014/01/11 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
webpack配置的最佳实践分享
2017/04/21 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
vue仿element实现分页器效果
2018/09/13 Javascript
[56:17]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
在Python3中使用asyncio库进行快速数据抓取的教程
2015/04/02 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
python入门教程之识别验证码
2017/03/04 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
详解django中使用定时任务的方法
2018/09/27 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
《美丽的小兴安岭》教学反思
2014/02/26 职场文书
实践单位评语
2014/04/26 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
邀请函的格式
2015/01/30 职场文书
复活读书笔记
2015/06/29 职场文书