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实现的检测网站挂马程序
Nov 30 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
在Django中限制已登录用户的访问的方法
Jul 23 Python
详解Python迭代和迭代器
Mar 28 Python
Python 自动刷博客浏览量实例代码
Jun 14 Python
使用python 爬虫抓站的一些技巧总结
Jan 10 Python
django解决跨域请求的问题
Nov 11 Python
python scipy卷积运算的实现方法
Sep 16 Python
解决python脚本中error: unrecognized arguments: True错误
Apr 20 Python
Django Form常用功能及代码示例
Oct 13 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
Flask搭建一个API服务器的步骤
May 28 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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
PHP中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
PHP7多线程搭建教程
2017/04/21 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
JQuery从头学起第一讲
2010/07/04 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
2015/03/05 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
2015/08/25 Javascript
Vue侧滑菜单组件——DrawerLayout
2017/12/18 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
vue axios 给生产环境和发布环境配置不同的接口地址(推荐)
2018/05/08 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
详解JavaScript修改注册表的方法
2020/01/05 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
python常见数制转换实例分析
2015/05/09 Python
Python 多线程的实例详解
2017/09/07 Python
tensorflow: 查看 tensor详细数值方法
2018/06/13 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
Python求平面内点到直线距离的实现
2020/01/19 Python
python连接PostgreSQL过程解析
2020/02/09 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
用CSS3绘制三角形的简单方法
2015/07/17 HTML / CSS
基于HTML5的WebGL实现json和echarts图表展现在同一个界面
2017/10/26 HTML / CSS
SQL面试题
2013/12/09 面试题
公司节能减排方案
2014/05/16 职场文书
关于运动会的广播稿(10篇)
2014/09/12 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书