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开发环境搭建
Dec 16 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
Jan 24 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
Dec 07 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
浅谈Python 递归算法指归
Aug 22 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
Python爬虫基础初探selenium
May 31 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 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
SONY SRF-40W电路分析
2021/03/02 无线电
PHP学习笔记(二):变量详解
2015/04/17 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
JavaScript CSS修改学习第六章 拖拽
2010/02/19 Javascript
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
JS的document.all函数使用示例
2013/12/30 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
原生js和jQuery随意改变div属性style的名称和值
2014/10/22 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
javascript函数式编程实例分析
2015/04/25 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
Vue组件化通讯的实例代码
2017/06/23 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
Vue中父子组件的值传递与方法传递
2020/09/28 Javascript
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
python使用Qt界面以及逻辑实现方法
2019/07/10 Python
详解Django 时间与时区设置问题
2019/07/23 Python
python json 递归打印所有json子节点信息的例子
2020/02/27 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
物业经理求职自我评价
2013/09/22 职场文书
三好学生自我鉴定
2013/12/17 职场文书
小学教师师德整改措施
2014/09/29 职场文书
实习协议书
2015/01/27 职场文书
小学端午节活动总结
2015/02/11 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
springboot 多数据源配置不生效遇到的坑及解决
2021/11/17 Java/Android
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android