python中hasattr()、getattr()、setattr()函数的使用
在阅读高手写的代码时,有很多简写的形式,如果没有见过还真的看不太懂是什么意思,其中一个比较常用的就是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对象的属性的值,如果存在则返回属性值,如果不存在分为两种情况,一种是没有default参数时,会直接报错;给定了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)
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;
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:531509025
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> 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')
20
>>>
一般先判断对象中是否存在某属性,如果存在则返回;如果不存在,则给对象增加属性并赋值;很简单的if-else判断:
>>> 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')
20
>>>
python中hasattr()、getattr()、setattr()函数的使用相关推荐
- Python中hasattr() getattr() setattr() 函数的使用
hasattr(object,name)函数: 判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False. class functio ...
- python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...
- Python的hasattr() getattr() setattr() 函数使用方法详解
Python的hasattr() getattr() setattr() 函数使用方法详解 (一) hasattr(object,name) 函数 判断一个对象里面是否有 name 属性或者 name ...
- python中hasattr,getattr,setattr的区别
class meta:name = 'miao'password = '123456'def miao(self, i):return i + 1print(hasattr(meta, 'name') ...
- Python的hasattr() getattr() setattr() 函数使用方法
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. >>> class ...
- python hasattr() getattr() setattr()函数的使用
hasattr(object,name):用于判断一个对象里中是否存在name这一特性. 由测试结果可知,对象a里包含特性name和方法greet(),所以输出True,而不包含特性age,所以has ...
- [转载] python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解
参考链接: Python hasattr() hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回Fa ...
- Python hasattr() getattr() setattr() 函数使用
1.setattr(object, name, values) 给对象设置属性,如果对象不存在,则创建对象 layers = nn.Sequential(nn.Conv2d(curr_dim, cur ...
- python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...
- python hasattr函数_Python的反射机制、hasattr() getattr() setattr() 函数使用方法详解
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...
最新文章
- linux内核唤醒过程,Linux内核启动过程分析
- .NET Core多平台项目模板eShopOnContainers编译手记
- 记录 Annotation processing is not supported for module cycles.
- 从零开始学习PYTHON3讲义(二)把Python当做计算器
- MAGENTO MOUDLE WEB FRONTEND
- dpkg命令用法、Ubuntu下deb包的解压、打包、安装、卸载及常用命令参数
- 2010.2--ip redirects 和 ip directed-broadcast含义
- 初中计算机位图和矢量图教案,浅析图形图像软件教学中位图与矢量图的区别
- JS打开新窗口的2种方式
- 2020全国地图矢量数据gis地图数据(下载获取支持)
- Android 7 soter,安卓首发!OPPO Find X全面支持微信人脸支付功能
- 我的世界java甘蔗机_我的世界甘蔗机怎么做? MineCraft甘蔗机图文教程
- android基带版本,Android - 基带版本为未知时自动隐藏
- HTMLCSS的语法与使用
- Docker安装与镜像的使用
- Windows10系统安装软件后软件界面异常(变得很小或很大),界面显示不完全的解决方案
- 主题:内存的管理 DATE:2004-09-17
- openGL应用复杂度评价
- 达梦数据库-插入单引号‘和双引号‘‘
- 从0糖到0防腐剂,元气森林缘何偏向“虎山行”?
热门文章
- linux下mysql无法看到3306端口监听
- XenApp Farm:修改密码、退域、更改Farm
- SharePoint基础之九- Site Page与Application Page
- My MPC系列·暴风影音 V5.00 RC3
- linux 网络7层模型,Linux网络编程——OSI七层模型、TCP/IP模型
- 如何区分“Invoice代码”和“Invoice号码”?
- F110报错:Company codes **/** do not appear in proposal ***; correct
- SAP中批量更改凭证行项目方法
- ALEIDoc EDI(5)--Inbound Function
- 多语种下的卡萨帝故事