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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
python通过文件头判断文件类型
Oct 30 Python
Python单例模式实例详解
Mar 01 Python
Python对列表中的各项进行关联详解
Aug 15 Python
Python实现基于多线程、多用户的FTP服务器与客户端功能完整实例
Aug 18 Python
谈谈python中GUI的选择
Mar 01 Python
Windows下Python3.6安装第三方模块的方法
Nov 22 Python
pytorch中的transforms模块实例详解
Dec 31 Python
keras的backend 设置 tensorflow,theano操作
Jun 30 Python
openCV提取图像中的矩形区域
Jul 21 Python
Python实现七个基本算法的实例代码
Oct 08 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 提速工具eAccelerator 配置参数详解
2010/05/16 PHP
php之CodeIgniter学习笔记
2013/06/17 PHP
PHP、Python和Javascript的装饰器模式对比
2015/02/03 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
用roll.js实现的图片自动滚动+鼠标触动的特效
2007/03/18 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
ES6新特性五:Set与Map的数据结构实例分析
2017/04/21 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
生产制造追溯系统之再说条码打印
2019/06/03 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
简单的连接MySQL与Python的Bottle框架的方法
2015/04/30 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python使用reportlab模块生成PDF格式的文档
2019/03/11 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
python打印异常信息的两种实现方式
2019/12/24 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
介绍一下你对SOA的认识
2016/04/24 面试题
工程现场管理求职自荐信
2013/10/02 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
初中数学教学反思
2014/01/16 职场文书
创业计划书的写作技巧及要点
2014/01/31 职场文书
实用的简历自我评价
2014/03/06 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
防震减灾主题班会
2015/08/14 职场文书
2019大学竞选班长发言稿
2019/06/27 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
浅谈Redis的事件驱动模型
2022/05/30 Redis