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代码来解图片迷宫的方法整理
Apr 02 Python
Python简明入门教程
Aug 04 Python
基于并发服务器几种实现方法(总结)
Dec 29 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
在python中只选取列表中某一纵列的方法
Nov 28 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
对python中if语句的真假判断实例详解
Feb 18 Python
Django集成MongoDB实现过程解析
Dec 01 Python
Pytorch 中的optimizer使用说明
Mar 03 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
46 个非常有用的 PHP 代码片段
2016/02/16 PHP
php写入mysql中文乱码的实例解决方法
2019/09/17 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
比Jquery的document.ready更快的方法
2010/04/28 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
json字符串之间的相互转换示例代码
2014/08/21 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
关于AngularJs数据的本地存储详解
2017/01/20 Javascript
Vue2 配置 Axios api 接口调用文件的方法
2017/11/13 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
jsonp跨域及实现百度首页联想功能的方法
2018/08/30 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
Python中的sort()方法使用基础教程
2017/01/08 Python
pyhton列表转换为数组的实例
2018/04/04 Python
python监控文件并且发送告警邮件
2018/06/21 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
Python中SQLite如何使用
2020/05/27 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
pycharm激活码免费分享适用最新pycharm2020.2.3永久激活
2020/11/25 Python
详解css3中 text-fill-color属性
2019/07/08 HTML / CSS
《回乡偶书》教学反思
2014/04/12 职场文书
《红军不怕远征难》教学反思
2014/04/14 职场文书
实习单位鉴定意见
2015/06/04 职场文书
浅谈Golang 嵌套 interface 的赋值问题
2021/04/29 Golang
js中Object.create实例用法详解
2021/10/05 Javascript