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 性能提升的几种方法
Jul 15 Python
django实现前后台交互实例
Aug 07 Python
Python 通配符删除文件的实例
Apr 24 Python
对python:print打印时加u的含义详解
Dec 15 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
python 获取微信好友列表的方法(微信web)
Feb 21 Python
python selenium 查找隐藏元素 自动播放视频功能
Jul 24 Python
Django 响应数据response的返回源码详解
Aug 06 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
python中什么是面向对象
Jun 11 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 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/10/09 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
PHP微信企业号开发之回调模式开启与用法示例
2017/11/25 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
javascript设计模式 封装和信息隐藏(上)
2012/07/24 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
JS对文本框值的判断示例
2014/03/10 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
Javascript刷新窗口方法小结
2015/10/21 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
jquery 验证用户名是否重复代码实例
2019/05/14 jQuery
详解JavaScript原型与原型链
2020/11/16 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
Python3中使用PyMongo的方法详解
2017/07/28 Python
浅谈python中np.array的shape( ,)与( ,1)的区别
2018/06/04 Python
Python对excel文档的操作方法详解
2018/12/10 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
2020/06/30 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
家佳咖啡店创业计划书
2013/12/27 职场文书
教师个人鉴定材料
2014/02/08 职场文书
红旗方阵解说词
2014/02/12 职场文书
以幸福为主题的活动方案
2014/08/22 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
拉贝日记观后感
2015/06/05 职场文书
警示教育观后感
2015/06/17 职场文书
高效课堂教学反思
2016/02/24 职场文书
Mysql基础之常见函数
2021/04/22 MySQL