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根据出生日期返回年龄的方法
Mar 26 Python
Python实现批量更换指定目录下文件扩展名的方法
Sep 19 Python
Python中的命令行参数解析工具之docopt详解
Mar 27 Python
python构建自定义回调函数详解
Jun 20 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
Python网络编程详解
Oct 31 Python
PyTorch搭建一维线性回归模型(二)
May 22 Python
关于python3中setup.py小概念解析
Aug 22 Python
python中urllib.request和requests的使用及区别详解
May 05 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
如何用Python 加密文件
Sep 10 Python
Python实现制作销售数据可视化看板详解
Nov 27 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遍历目录方法小结
2015/03/10 PHP
PHP排序算法类实例
2015/06/17 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP设计模式之装饰器(装饰者)模式(Decorator)入门与应用详解
2019/12/13 PHP
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
sliderToggle在写jquery的计时器setTimeouter中不生效
2014/05/26 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
JavaScript使用DeviceOne开发实战(二) 生成调试安装包
2015/12/01 Javascript
JavaScript动态创建div等元素实例讲解
2016/01/06 Javascript
jQuery AjaxUpload 上传图片代码
2016/02/02 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Node.js console控制台简单用法分析
2019/01/04 Javascript
解决vue 使用axios.all()方法发起多个请求控制台报错的问题
2020/11/09 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
Python基础之函数用法实例详解
2014/09/10 Python
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
使用OpCode绕过Python沙箱的方法详解
2019/09/03 Python
python小白切忌乱用表达式
2020/05/29 Python
python的launcher用法知识点总结
2020/08/07 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
阿联酋航空官方网站:Emirates
2017/10/17 全球购物
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
学生发电厂实习自我鉴定
2013/09/22 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
英语导游词
2015/02/13 职场文书
公司规章制度范本
2015/08/03 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
创业计划书之服装
2019/10/07 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
oracle索引总结
2021/09/25 Oracle
详解PyTorch模型保存与加载
2022/04/28 Python