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处理文本文件中控制字符的方法
Feb 07 Python
python 接收处理外带的参数方法
Dec 03 Python
python 实现数字字符串左侧补零的方法
Dec 04 Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 Python
Python中*args和**kwargs的区别详解
Sep 17 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
python异常处理try except过程解析
Feb 03 Python
Python操作Jira库常用方法解析
Apr 10 Python
Python 多线程共享变量的实现示例
Apr 17 Python
python 实现波浪滤镜特效
Dec 02 Python
使用Python提取文本中含有特定字符串的方法示例
Dec 09 Python
python如何发送带有附件、正文为HTML的邮件
Feb 27 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学习之运算符相关概念
2011/06/09 PHP
Laravel配置全局公共函数的方法步骤
2019/05/09 PHP
在多个页面使用同一个HTML片段《续》
2011/03/04 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
jquery实现动态操作select选中
2015/02/11 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
Bootstrap表单布局样式源代码
2016/07/04 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法
2016/10/30 Javascript
JavaScript &amp; jQuery完美判断图片是否加载完毕
2017/01/08 Javascript
原生js实现中奖信息无间隙滚动效果
2017/01/18 Javascript
JSON.stringify()方法讲解
2019/01/31 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python+pillow绘制矩阵盖尔圆简单实例
2018/01/16 Python
详谈在flask中使用jsonify和json.dumps的区别
2018/03/26 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
Python编写打字训练小程序
2019/09/26 Python
python实现可下载音乐的音乐播放器
2020/02/25 Python
CSS3中使用RGBa来调节透明度的教程
2016/05/09 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
Zavvi荷兰:英国大型音像制品和图书游戏零售商
2018/03/22 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
职业技术学校毕业生推荐信
2013/12/03 职场文书
公司活动策划方案
2014/01/13 职场文书
热爱祖国的演讲稿
2014/05/04 职场文书
个人课题方案
2014/05/08 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
廉洁自律个人总结
2015/02/14 职场文书
新郎接新娘保证书
2015/05/08 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
Python卷积神经网络图片分类框架详解分析
2021/11/07 Python