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写的一个简单DNS服务器实例
Jun 04 Python
利用python批量检查网站的可用性
Sep 09 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
Dec 19 Python
python实现手机销售管理系统
Mar 19 Python
Python OpenCV实现视频分帧
Jun 01 Python
python 日期排序的实例代码
Jul 11 Python
python3 反射的四种基本方法解析
Aug 26 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
python爬取天气数据的实例详解
Nov 20 Python
python 对象真假值的实例(哪些视为False)
Dec 11 Python
基于python定位棋子位置及识别棋子颜色
Jul 26 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实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
setTimeout 不断吐食CPU的问题分析
2009/04/01 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jquery 获取标签名(tagName)示例代码
2013/07/11 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
vue router 跳转后回到顶部的实例
2018/08/31 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
python单链表实现代码实例
2013/11/21 Python
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
Python中的类与对象之描述符详解
2015/03/27 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
TensorFlow的权值更新方法
2018/06/14 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
django中forms组件的使用与注意
2019/07/08 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
Python二元赋值实用技巧解析
2019/10/25 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
2分钟教你实现环形/扇形菜单(基础版)
2020/01/15 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
应届生服装设计自我评价
2013/09/20 职场文书
班长自荐书范文
2014/02/11 职场文书
主题班会开场白
2015/06/01 职场文书
致创业的您:这类人不适合餐饮创业
2019/08/19 职场文书
使用python绘制横竖条形图
2022/04/21 Python