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. Nginx REWRITE阶段

    rewrite_log on ;#每次rewrite都会记录一条记录在errorlog里 error_log logs/xxx.log notice; location /first { rewrit ...

  2. linux 内核参数优化----最大线程数限制及当前线程数查询

    1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_p ...

  3. Hopcroft-Carp 算法模板 自用

    #include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...

  4. day31 configparser 配置文件模块

    #__author__: Administrator #__date__: 2018/8/8 # configparse 生成配置文件,配置文会以件.ini结尾 # 对于格式有要求 # 创建配置文档 ...

  5. 【BZOJ2245】[SDOI2011]工作安排(费用流)

    [BZOJ2245][SDOI2011]工作安排(费用流) 题面 BZOJ 洛谷 题解 裸的费用流吧. 不需要拆点,只需要连边就好了,保证了\(W_j<W_{j+1}\). #include&l ...

  6. FreeRTOS 中 systick 相关配置

    @2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...

  7. luogu4181 [USACO18JAN]Rental Service (贪心)

    我们要出租的话,一定是出租产奶量最少的牛 那我们就看出租多少头牛(其他的卖奶)的时候答案最大就可以了. (注意N有可能小于R) #include<bits/stdc++.h> #defin ...

  8. A1032. Sharing

    To store English words, one method is to use linked lists and store a word letter by letter. To save ...

  9. CodeForces786B 线段树 + 最短路

    给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置. 其中q有三种不同的操作: 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线 输入u,l,r,wu,l, ...

  10. excel自动化翻译2

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...