python中hasattr()、getattr()、setattr()函数的使用


Posted in Python onAugust 16, 2019

 引言:

在阅读源码时,有很多简写的形式,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr()、getattr()、setattr()函数的使用也一并学习了一下。

正文:

1. hasattr(object, name)

判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法;有则返回True,没有则返回False;需要注意的是name参数是string类型,所以不管是要判断变量还是方法,其名称都以字符串形式传参;getattr和setattr也同样;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'A()类的方法func()'
>>> 
>>> hasattr(A, 'name')
True
>>> 
>>> hasattr(A, 'age')
False
>>> 
>>> hasattr(A, 'func')
True
>>>

2. getattr(object, name[, default])

获取object对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况:

(1)没有default参数时,会直接报错;

(2)给定了default参数,若对象本身没有name属性,则会返回给定的default值;

如果给定的属性name是对象的方法,则返回的是函数对象,需要调用函数对象来获得函数的返回值;调用的话就是函数对象后面加括号,如func之于func();

另外还需要注意:

如果给定的方法func()是实例函数,则不能写getattr(A, 'func')(),因为fun()是实例函数的话,是不能用A类对象来调用的,应该写成getattr(A(), 'func')();

实例函数和类函数的区别:

实例函数定义时,直接def func(self):,这样定义的函数只能是将类实例化后,用类的实例化对象来调用;

而类函数定义时,需要用@classmethod来装饰,函数默认的参数一般是cls,类函数可以通过类对象来直接调用,而不需要对类进行实例化;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> getattr(A, 'name')
'python'
>>> 
>>> getattr(A, 'age')
# age变量不存在则报错
Traceback (most recent call last):
 File "<pyshell#464>", line 1, in <module>
  getattr(A, 'age')
AttributeError: class A has no attribute 'age'
>>> 
>>> getattr(A, 'age', 20)
>>> 
>>> getattr(A, 'func')
<unbound method A.func>
>>> 
>>> getattr(A, 'func')()

# func()函数不能被A类对象调用,所以报错, 需要用类的实例化对象来调用
Traceback (most recent call last):
 File "<pyshell#470>", line 1, in <module>
  getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> 
>>> getattr(A(), 'func')()
'Hello world'
>>> 
>>> class A(object):
  

name = 'python'
  

@classmethod
  

def func(cls):
    


return 'the method of A object.'
>>> 
>>> getattr(A, 'func')()
'the method of A object.'
>>>

3. setattr(object, name, value)

给object对象的name属性赋值value,如果对象原本存在给定的属性name,则setattr会更改属性的值为给定的value;如果对象原本不存在属性name,setattr会在对象中创建属性,并赋值为给定的value;

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'
>>> 
>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
>>>

一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值:

>>> 
>>> class A():
  name = 'python'
  def func(self):
    return 'Hello world'
>>> 
>>> if hasattr(A, 'age'):
  print getattr(A, 'age')
else:
  setattr(A, 'age', 20)
>>> 
>>> getattr(A, 'age')
>>>

 感受一下:

python中hasattr()、getattr()、setattr()函数的使用

总结

以上所述是小编给大家介绍的python中hasattr()、getattr()、setattr()函数的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python通过解析网页实现看报程序的方法
Aug 04 Python
python3中bytes和string之间的互相转换
Feb 09 Python
python学生管理系统代码实现
Apr 05 Python
python线程池threadpool实现篇
Apr 27 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
对python中dict和json的区别详解
Dec 18 Python
Python3基础教程之递归函数简单示例
Jun 07 Python
python使用pandas处理excel文件转为csv文件的方法示例
Jul 18 Python
python3使用GUI统计代码量
Sep 18 Python
python的命名规则知识点总结
Oct 04 Python
Pytorch 实现数据集自定义读取
Jan 18 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
Python中IP地址处理IPy模块的方法
Aug 16 #Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 #Python
Pyinstaller 打包exe教程及问题解决
Aug 16 #Python
python函数参数(必须参数、可变参数、关键字参数)
Aug 16 #Python
Python Web框架之Django框架文件上传功能详解
Aug 16 #Python
基于 Django 的手机管理系统实现过程详解
Aug 16 #Python
python创建与遍历List二维列表的方法
Aug 16 #Python
You might like
PHP函数utf8转gb2312编码
2006/12/21 PHP
php中通过curl smtp发送邮件
2012/06/05 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
2014/06/19 PHP
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
JQuery表格内容过滤的实现方法
2013/07/05 Javascript
jquery的ajax异步请求接收返回json数据实例
2014/06/16 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
Python MD5文件生成码
2009/01/12 Python
python通过smpt发送邮件的方法
2015/04/30 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
浅谈flask截获所有访问及before/after_request修饰器
2018/01/18 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
使用pytorch完成kaggle猫狗图像识别方式
2020/01/10 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python 如何实现遗传算法
2020/09/22 Python
CSS3实现各种图形的示例代码
2016/10/19 HTML / CSS
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
广告设计专业自荐信范文
2013/11/14 职场文书
学院书画协会部门岗位职责
2013/12/01 职场文书
求职自我评价范文100字
2014/09/23 职场文书
物业项目经理岗位职责
2015/04/01 职场文书
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
python使用BeautifulSoup 解析HTML
2022/04/24 Python