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编写一个在Linux下实现截图分享的脚本的教程
Apr 24 Python
tensorflow入门之训练简单的神经网络方法
Feb 26 Python
Python使用装饰器模拟用户登陆验证功能示例
Aug 24 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
Python爬虫爬取Bilibili弹幕过程解析
Oct 10 Python
django中间键重定向实例方法
Nov 10 Python
基于keras 模型、结构、权重保存的实现
Jan 24 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
python 装饰器的实际作用有哪些
Sep 07 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 Python
python不同版本的_new_不同点总结
Dec 09 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递归调用的小技巧讲解
2013/02/19 PHP
php分页函数完整实例代码
2014/09/22 PHP
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
thinkphp5框架API token身份验证功能示例
2019/05/21 PHP
jQuery 表单验证扩展(三)
2010/10/20 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
三种方式获取XMLHttpRequest对象
2014/04/21 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
分享自己用JS做的扫雷小游戏
2016/02/17 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
JS异步文件上传(兼容IE8+)
2017/04/02 Javascript
nodejs 最新版安装npm 的使用详解
2018/01/18 NodeJs
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
python实现多线程采集的2个代码例子
2014/07/07 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python程序 创建多线程过程详解
2019/09/23 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Python递归函数特点及原理解析
2020/03/04 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
在HTML5 Canvas中放入图片和保存为图片的方法
2014/05/03 HTML / CSS
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
《一件运动衫》教学反思
2014/02/19 职场文书
《草原的早晨》教学反思
2014/04/08 职场文书
主题班会演讲稿
2014/05/22 职场文书
支部组织生活会方案
2014/06/10 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android