getattr是返回对象属性value的函数,用法:getattr(object,attribute_name[,default])

如果对象拥有属性,则返回属性value,如果对象没有该属性并且也没有定义__getattr__方法的时候,则要么抛出异常要么有default参数返回default值。

但是,当类中定义了__getattr__的时候,在属性不存在的情况下,getattr就会调用__getattr__方法看看能不能获取到value

以上结论适用于心事累也适用于就是累

class C():
a = 'abc' def __getattr__(self, name):
print ('hhh')
if name == 'adult':
return True else: raise AttributeError(name) a=C()
aa=getattr(a,'a')#aa为'abc'
b=a.adult#打印hhh,b为True
c=getattr(a,'adult',6)#打印hhh,c为True
d=getattr(a,'ss',4)#打印hhh,d为4
d=getattr(a,'ss')#打印hhh,抛出异常

object.__getattribute__(self, name)
实例instance通过instance.name访问属性name__getattribute__方法一直会被调用,无论属性name是否追溯到。如果类还定义了__getattr__方法,除非通过__getattribute__显式的调用它,或者__getattribute__方法出现AttributeError错误,否则__getattr__方法不会被调用了。如果在__getattribute__(self, attr)方法下存在通过self.attr访问属性,会出现无限递归错误。
如下所示,ClassA中定义了__getattribute__方法,实例insA获取属性时,都会调用__getattribute__返回结果,即使是访问__dict__属性。

class ClassA(object):

    def __init__(self, classname):
self.classname = classname def __getattr__(self, attr):
return('invoke __getattr__', attr) def __getattribute__(self, attr):
return('invoke __getattribute__', attr) insA = ClassA('ClassA')
print(insA.__dict__)
# ('invoke __getattribute__', '__dict__') print(insA.classname)
# ('invoke __getattribute__', 'classname') print(insA.grade)
# ('invoke __getattribute__', 'grade')

还有一个是setattr,如果类自定义了__setattr__,对实例属性的赋值就会调用它。需要注意的是,在__setattr__下还有self.attr的赋值操作就会出现无线递归__setattr__的情况。自己实现__setattr__有很大风险,所以一般情况都还是继承object类的__setattr__方法。

class ClassA(object):
def __init__(self, classname):
self.classname = classname def __setattr__(self, name, value):
# self.name = value # 如果还这样调用会出现无限递归的情况
print('invoke __setattr__') insA = ClassA('ClassA') # __init__中的self.classname调用__setattr__。
# invoke __setattr__ print(insA.__dict__)
# {} insA.tag = 'insA'
# invoke __setattr__ print(insA.__dict__)
# {}

与getattr()函数会调用__getattr__类似,setattr()函数也会调用__setattr__。setattr(object, name, values)

而hasattr就比较简单了,只是一个简单的判断

18年10月23日更新:

关于hasattr的原理:

hasattr的判断依据并不是以dir()所返回的列表为依据。

比如:

#!/usr/bin/env py3

class a:
pass print (dir(a))
print (hasattr(a,"mro"))

dir(a),返回的列表并不包含mro元素,但是用hasattr查看却是true

也就是说,如果hasattr(a,x)函数所有返回ture的属性x组成一个集合,那么,dir()所返回的列表,是这个集合的一个子集

再比如:

#!/usr/bin/env py3

class a:
ss=3
def __getattr__(self, name):
if name == 's':
return 5
aa=a()
print (dir(aa))#列表中不包含s
print (hasattr(aa,"s"))#返回true

delattr是用来删除属性

需要注意的是他只能用来删除实例属性,删除类属性将报错

#!/usr/bin/env py3

class a:
ss=3
def __init__(self):
self.k=4
def __getattr__(self, name):
if name == 's':
return 5
aa=a()
delattr(aa,'k')
#delattr(aa,'ss')#报错
#delattr(aa,'s')#报错

参考:

https://www.cnblogs.com/elie/p/6685429.html

getattr getattribute setattr hasattr delattr的更多相关文章

  1. (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...

  2. 反射---hasattr、getattr、setattr、delattr

    class Foo: f = "类的静态变量" def __init__(self,name,age): self.name = name self.age = age def s ...

  3. Python3 hasattr()、getattr()、setattr()、delattr()函数

    hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,name) 参数: object--对象 name--字符串,属性名 返回值: 如果对象 ...

  4. Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数

    反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...

  5. python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

    主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...

  6. 反射(hasattr和getattr和setattr和delattr)

    目录 一.反射在类中的使用 1.1 应用 二.反射在模块中的使用 2.1 前言 2.2 反射机制 2.2.1 getattr() 2.2.2 hasattr(object, name) 2.2.3 s ...

  7. hasattr、getattr、setattr、delattr、反射

    目录 hasattr getattr setattr delattr 反射的应用 __import__(了解) 思考: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对 ...

  8. 反射(hasattr和setattr和delattr)

    反射(hasattr和setattr和delattr) 一.反射在类中的使用 反射就是通过字符串来操作类或者对象的属性, 反射本质就是在使用内置函数,其中反射有以下四个内置函数: hasattr:通过 ...

  9. python中hasattr()、getattr()、setattr()函数的使用

    1. hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是n ...

随机推荐

  1. yield与递归的组合运用

  2. Systemed systemctl 创建服务 详解

    原文:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 一.由来 历史上,Linux 的启动一直采用init进 ...

  3. BZOJ1299[LLH邀请赛]巧克力棒——Nim游戏+搜索

    题目描述 TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度.TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒). ...

  4. 睡前小dp-hdu3853-概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3853 膜猴烧酒madoka 讲定义为dp[i][j] 位置为ij的魔法值期望,可以发现dp[i][j] = dp ...

  5. POJ3268(Silver Cow Party)

    题意: 有n头牛去第x个点开party(有点高大上~),单向路,去到还得回来,问这n头牛每一头花费的总时间的最大值是多少 模板spfa: #include <iostream> #incl ...

  6. UVa - 10339

    It has been said that a watch that is stopped keeps better time than one that loses 1 second per day ...

  7. day13 for内部机制详解,迭代器

    迭代器定义: 可迭代协议:含有iter方法的都是可以迭代的 迭代器协议: 有.next 方法,和iter的都是迭代器 必须存在终结 特点: 节省空间 方便逐个取值,一个迭代器只能取一次 简单来说:满足 ...

  8. BZOJ 4032: [HEOI2015]最短不公共子串

    4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 224[Submit][Sta ...

  9. 全面解析Java类加载器

    深入理解和探究Java类加载机制---- 1.java.lang.ClassLoader类介绍 java.lang.ClassLoader类的基本职责就是根据一个指定的类的名称,找到或者生成其对应的字 ...

  10. java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] 不能使用 '(未知的)';文件已在使用中

    最近查看程序输入的日志时发现一个java连接Access的程序时不时的抛出: java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driv ...