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中使用第三方库xlrd来写入Excel文件示例
Apr 05 Python
浅析Python 中整型对象存储的位置
May 16 Python
Pycharm学习教程(4) Python解释器的相关配置
May 03 Python
Python 错误和异常代码详解
Jan 29 Python
使用python实现BLAST
Feb 12 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
如何将 awk 脚本移植到 Python
Dec 09 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
python实现FTP文件传输的方法(服务器端和客户端)
Mar 20 Python
python简单实现9宫格图片实例
Sep 03 Python
Python 阶乘详解
Oct 05 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安装xdebug/php安装pear/phpunit详解步骤(图)
2013/12/22 PHP
php中动态调用函数的方法
2015/03/16 PHP
Yii实现显示静态页的方法
2016/04/25 PHP
详解WordPress中添加友情链接的方法
2016/05/21 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
2017/11/06 PHP
php原生数据库分页的代码实例
2019/02/18 PHP
使用laravel的migrate创建数据表的方法
2019/09/30 PHP
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
解决Python传递中文参数的问题
2015/08/04 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
2019/12/11 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
浅谈Pytorch torch.optim优化器个性化的使用
2020/02/20 Python
JupyterNotebook 输出窗口的显示效果调整方法
2020/04/13 Python
pycharm 使用anaconda为默认环境的操作
2021/02/05 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
澳大利亚在线批发商:Simply Wholesale
2021/02/24 全球购物
Ruby如何实现动态方法调用
2012/11/18 面试题
职业生涯规划书范文
2014/03/10 职场文书
高效课堂标语
2014/06/26 职场文书
规范化管理年活动总结
2014/08/29 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
起诉离婚协议书样本
2014/11/25 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
父亲节活动总结
2015/02/12 职场文书
对公司的意见和建议
2015/06/04 职场文书
《分数的意义》教学反思
2016/02/20 职场文书
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL