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 实现插入排序算法
Jun 05 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python制作爬虫抓取美女图
Jan 20 Python
tensorflow学习教程之文本分类详析
Aug 07 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
python实现画五角星和螺旋线的示例
Jan 20 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
Python+pyplot绘制带文本标注的柱状图方法
Jul 08 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
在python3中实现更新界面
Feb 21 Python
Python爬虫爬取微博热搜保存为 Markdown 文件的源码
Feb 22 Python
windows安装python超详细图文教程
May 21 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 php_openssl.dll的作用
2013/07/01 PHP
phpmailer中文乱码问题的解决方法
2014/04/22 PHP
用 Composer构建自己的 PHP 框架之基础准备
2014/10/30 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
thinkphp分页集成实例
2017/07/24 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
也说JavaScript中String类的replace函数
2011/09/22 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
vue项目实战总结篇
2018/02/11 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
nodejs 十六进制字符串型数据与btye型数据相互转换
2018/07/30 NodeJs
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
微信小程序点击滚动到指定位置的实现
2020/05/22 Javascript
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
啥是佩奇?使用Python自动绘画小猪佩奇的代码实例
2019/02/20 Python
python 堆和优先队列的使用详解
2019/03/05 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
洗车工岗位职责
2014/03/15 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
学前班语言教学计划
2015/01/20 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
信息简报范文
2015/07/21 职场文书
Python实现socket库网络通信套接字
2021/06/04 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis