在阅读高手写的代码时,有很多简写的形式,如果没有见过还真的看不太懂是什么意思,其中一个比较常用的就是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()函数的使用相关推荐

  1. Python中hasattr() getattr() setattr() 函数的使用

    hasattr(object,name)函数: 判断一个对象里面是否有name属性或者name方法,返回bool值,有name属性(方法)返回True,否则返回False. class functio ...

  2. python中setattr用法_详解Python的hasattr() getattr() setattr() 函数使用方法

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  3. Python的hasattr() getattr() setattr() 函数使用方法详解

    Python的hasattr() getattr() setattr() 函数使用方法详解 (一) hasattr(object,name) 函数 判断一个对象里面是否有 name 属性或者 name ...

  4. python中hasattr,getattr,setattr的区别

    class meta:name = 'miao'password = '123456'def miao(self, i):return i + 1print(hasattr(meta, 'name') ...

  5. Python的hasattr() getattr() setattr() 函数使用方法

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. >>> class ...

  6. python hasattr() getattr() setattr()函数的使用

    hasattr(object,name):用于判断一个对象里中是否存在name这一特性. 由测试结果可知,对象a里包含特性name和方法greet(),所以输出True,而不包含特性age,所以has ...

  7. [转载] python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解

    参考链接: Python hasattr() hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回Fa ...

  8. Python hasattr() getattr() setattr() 函数使用

    1.setattr(object, name, values) 给对象设置属性,如果对象不存在,则创建对象 layers = nn.Sequential(nn.Conv2d(curr_dim, cur ...

  9. python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

  10. python hasattr函数_Python的反射机制、hasattr() getattr() setattr() 函数使用方法详解

    hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False. 需要注意的是name要用括号括起来 ...

最新文章

  1. linux内核唤醒过程,Linux内核启动过程分析
  2. .NET Core多平台项目模板eShopOnContainers编译手记
  3. 记录 Annotation processing is not supported for module cycles.
  4. 从零开始学习PYTHON3讲义(二)把Python当做计算器
  5. MAGENTO MOUDLE WEB FRONTEND
  6. dpkg命令用法、Ubuntu下deb包的解压、打包、安装、卸载及常用命令参数
  7. 2010.2--ip redirects 和 ip directed-broadcast含义
  8. 初中计算机位图和矢量图教案,浅析图形图像软件教学中位图与矢量图的区别
  9. JS打开新窗口的2种方式
  10. 2020全国地图矢量数据gis地图数据(下载获取支持)
  11. Android 7 soter,安卓首发!OPPO Find X全面支持微信人脸支付功能
  12. 我的世界java甘蔗机_我的世界甘蔗机怎么做? MineCraft甘蔗机图文教程
  13. android基带版本,Android - 基带版本为未知时自动隐藏
  14. HTMLCSS的语法与使用
  15. Docker安装与镜像的使用
  16. Windows10系统安装软件后软件界面异常(变得很小或很大),界面显示不完全的解决方案
  17. 主题:内存的管理 DATE:2004-09-17
  18. openGL应用复杂度评价
  19. 达梦数据库-插入单引号‘和双引号‘‘
  20. 从0糖到0防腐剂,元气森林缘何偏向“虎山行”?

热门文章

  1. linux下mysql无法看到3306端口监听
  2. XenApp Farm:修改密码、退域、更改Farm
  3. SharePoint基础之九- Site Page与Application Page
  4. My MPC系列·暴风影音 V5.00 RC3
  5. linux 网络7层模型,Linux网络编程——OSI七层模型、TCP/IP模型
  6. 如何区分“Invoice代码”和“Invoice号码”?
  7. F110报错:Company codes **/** do not appear in proposal ***; correct
  8. SAP中批量更改凭证行项目方法
  9. ALEIDoc EDI(5)--Inbound Function
  10. 多语种下的卡萨帝故事