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加密自己的密码
Aug 04 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
python增加矩阵维度的实例讲解
Apr 04 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
Python实现购物评论文本情感分析操作【基于中文文本挖掘库snownlp】
Aug 07 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
Django框架视图函数设计示例
Jul 29 Python
python多进程重复加载的解决方式
Dec 13 Python
使用Python-OpenCV消除图像中孤立的小区域操作
Jul 05 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 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 空格,换行,跳格使用说明
2009/12/18 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
对PHP PDO的一些认识小结
2015/01/23 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
Yii核心验证器api详解
2016/11/23 PHP
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
JAVASCRIPT模式窗口中下载文件无法接收iframe的流
2013/10/11 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
LayUI表格批量删除方法
2018/08/15 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
微信小程序swiper使用网络图片不显示问题解决
2019/12/13 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
详解Python开发中如何使用Hook技巧
2017/11/01 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
2019/07/01 Python
python中eval与int的区别浅析
2019/08/11 Python
pytorch实现用Resnet提取特征并保存为txt文件的方法
2019/08/20 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
pandas数据拼接的实现示例
2020/04/16 Python
django正续或者倒序查库实例
2020/05/19 Python
Notino匈牙利:购买香水和化妆品
2019/04/12 全球购物
后进生转化工作制度
2014/01/17 职场文书
电台编导求职信
2014/05/06 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
亮剑精神观后感
2015/06/05 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书