hasattr(object, name)

判断一个对象(object)是否存在name属性或方法,返回boolean值,有name属性返回True, 否则返回False

In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'name')) # 注意:属性'name'是需要引号引起来的
True In [4]: print(hasattr(t, 'hello')) # 方法也是类的属性
True

getattr(object, name[, default])

获取对象object的属性或方法(name), 如果存在打印出来,如果不存在,打印默认值,默认值可选,默认值不存在报错对象没有该属性;

In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(getattr(t, 'name'))
hkey In [4]: print(getattr(t, 'hello'))
<bound method Test.hello of <__main__.Test object at 0x000001499524EE80>> In [5]: print(getattr(t, 'age'))
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-5-bd4a642cfb8c> in <module>()
----> 1 print(getattr(t, 'age')) # 没有该属性或方法 AttributeError: 'Test' object has no attribute 'age' In [6]: print(getattr(t, 'age', 20)) # 设置默认值
20

setattr(object, name, values)

给对象的属性赋值,若属性不存在,先创建再赋值

# object不存在属性(age), 用 setattr 新增属性 'age'
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'age'))
False In [4]: setattr(t, 'age', 20) In [5]: print(hasattr(t, 'age'))
True In [6]: print(getattr(t, 'age'))
20 # object 存在属性(name), 用 setattr 覆盖原属性值
In [1]: class Test(object):
...: name = 'hkey'
...: def hello(self):
...: print('hello ', self.name)
...: In [2]: t = Test() In [3]: print(hasattr(t, 'name')) # 使用 hasattr 检查object 是否存在'name'属性, True为存在
True In [4]: setattr(t, 'name', 'superman') # setattr 重新为'name'属性赋值为'superman' In [5]: print(getattr(t, 'name')) # 使用getattr 获取'name'属性的值
superman In [6]: print(t.name) # 直接调用实例't'的name属性
superman

从上面的实例发现,如果object已经存在属性,再次使用setattr为该属性赋值,该属性会发生变化,这里值得注意。

hasattr(), getattr(), setattr() 使用场景

* 作为反射对程序进行解耦操作 *

In [1]: class Test(object):
...: def __init__(self):
...: self.x = 1
...: self.y = 2
...:
...: def sum(self):
...: print(self.x + self.y)
...:
...: def sub(self):
...: print(self.x - self.y)
...: In [2]: t = Test() In [3]: while True:
...: cmd = input('-->').strip()
...: if hasattr(t, cmd): # 'hasattr' 判断 'cmd' 属性是否存在
...: func = getattr(t, cmd) # getattr 获取 'cmd' 属性的值
...: func() # 执行该属性
...: else:
...: setattr(t, cmd, t.sum) # 如果输入不存在的属性名, 使用 'setattr' 重新为 'cmd' 赋值为 't.sum'
...: func = getattr(t, cmd) # getattr 获取 'cmd' 属性的值
...: func() # 执行该属性
...: # 执行结果:
-->sum
3
-->sub
-1
-->dddddd
3

[ python ] hasattr()、getattr()、setattr() 三者关系及运用的更多相关文章

  1. Python hasattr,getattr,setattr,delattr

    #!/usr/bin/env python # -*- coding:utf-8 -*- # 作者:Presley # 邮箱:1209989516@qq.com # 时间:2018-11-04 # 反 ...

  2. Python的getattr(),setattr(),delattr(),hasattr()及类内建__getattr__应用

    @Python的getattr(),setattr(),delattr(),hasattr() 先转一篇博文,参考.最后再给出一个例子 getattr()函数是Python自省的核心函数,具体使用大体 ...

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

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

  4. python 内置函数的补充 isinstance,issubclass, hasattr ,getattr, setattr, delattr,str,del 用法,以及元类

    isinstance   是 python中的内置函数 , isinstance()用来判断一个函数是不是一个类型 issubclass  是python 中的内置函数,  用来一个类A是不是另外一个 ...

  5. hasattr() & getattr() & setattr()

    Python的hasattr() getattr() setattr() 函数使用方法详解   感谢作者 ---> 原文链接 hasattr(object, name) 判断一个对象里面是否有n ...

  6. 反射之hasattr() getattr() setattr() 函数

    Python的hasattr() getattr() setattr() 函数使用方法详解 hasattr(object, name)判断object中有没有一个name字符串对应的方法或属性,返回B ...

  7. isinstance/type/issubclass的用法,反射(hasattr,getattr,setattr,delattr)

    6.23 自我总结 面向对象的高阶 1.isinstance/type/issubclass 1.type 显示对象的类,但是不会显示他的父类 2.isinstance 会显示的对象的类,也会去找对象 ...

  8. [转]Python的getattr(),setattr(),delattr(),hasattr()

    getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...

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

    eval() 函数 --- 将字符串str当成有效的表达式来求值并返回计算结果. 语法:eval(source[, globals[, locals]]) ---> value 参数: sour ...

随机推荐

  1. [洛谷P5068][Ynoi2015]我回来了

    题目大意:给你一张$n(n\leqslant10^3)$个点$m(m\leqslant10^5)$个点的无向无权图,多组询问,每次询问给你一些二元组$(x_i,y_i)$,求有多少个$u$于至少一个二 ...

  2. POJ2826:An Easy Problem?!——题解(配特殊情况图)

    http://poj.org/problem?id=2826 题目大意:给两条线,让它接竖直下的雨,问其能装多少横截面积的雨. ———————————————————————————— 水题,看题目即 ...

  3. BZOJ3456:城市规划——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=3456 求出n个点的简单(无重边无自环)无向连通图数目 模数很熟悉,先敲一个NTT. 然后通过推导式 ...

  4. 洛谷 P1527 [国家集训队]矩阵乘法 解题报告

    P1527 [国家集训队]矩阵乘法 题目描述 给你一个\(N*N\)的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第\(K\)小数. 输入输出格式 输入格式: 第一行两个数\(N,Q\),表示矩阵大 ...

  5. git备份脚本

    #!/bin/bash BASEDIR=/home/git/gitlab DESTDIR=/home/silence/backups/gitlab SRCDIR=$BASEDIR/tmp/backup ...

  6. [技巧篇]11.JavaScript原生态如何获取浏览器请求地址中的参数

    var getAccessParams = function(){ var i,ilen,strs,keyName,keyValue, params={}, path = window.locatio ...

  7. eclipse好玩的插件集(一) CKEditor插件

    啥也不说,先上效果图: 当你输入完图片的url时,你可以得到预览的图像,从而进行宽高调整! 使用方法: 在eclipse市场中搜索ckeditor 配置操作如下:   进行文件关联,这样就可以直接用c ...

  8. AndroidStudio下加入百度地图的使用(一)——环境搭建

    AndroidStudio下加入百度地图的使用(一)--环境搭建 最近有学生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新 ...

  9. 【BZOJ】1552/3506 [Cerc2007]robotic sort

    [算法]splay [题解] splay维护序列,用权值(离散化)作为编号.每次找第i小的话直接找对应编号splay即可. 但是这样splay没有下传翻转标记?直接暴力找到路径然后从根到改结点push ...

  10. bzoj 3453 数论

    首先我们知道对于f(x)来说,它是一个k次的多项式,那么f(x)的通项公式可以表示成一个k+1次的式子,且因为f(x)没有常数项,所以我们设这个式子为 f(x)=Σ(a[i]*x^i) (1<= ...