getattr getattribute setattr hasattr delattr
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的更多相关文章
- (转)详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
原文:https://www.jb51.net/article/138363.htm hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,n ...
- 反射---hasattr、getattr、setattr、delattr
class Foo: f = "类的静态变量" def __init__(self,name,age): self.name = name self.age = age def s ...
- Python3 hasattr()、getattr()、setattr()、delattr()函数
hasattr()函数 hasattr()函数用于判断是否包含对应的属性 语法: hasattr(object,name) 参数: object--对象 name--字符串,属性名 返回值: 如果对象 ...
- Python 反射机制之hasattr()、getattr()、setattr() 、delattr()函数
反射机制 先看看我对Java中反射机制的通俗理解:反射之中包含了一个“反”的概念,所以要想解释反射就必须先从“正”开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化 ...
- python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)
主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...
- 反射(hasattr和getattr和setattr和delattr)
目录 一.反射在类中的使用 1.1 应用 二.反射在模块中的使用 2.1 前言 2.2 反射机制 2.2.1 getattr() 2.2.2 hasattr(object, name) 2.2.3 s ...
- hasattr、getattr、setattr、delattr、反射
目录 hasattr getattr setattr delattr 反射的应用 __import__(了解) 思考: 在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对 ...
- 反射(hasattr和setattr和delattr)
反射(hasattr和setattr和delattr) 一.反射在类中的使用 反射就是通过字符串来操作类或者对象的属性, 反射本质就是在使用内置函数,其中反射有以下四个内置函数: hasattr:通过 ...
- python中hasattr()、getattr()、setattr()函数的使用
1. hasattr(object, name) 判断object对象中是否存在name属性,当然对于python的对象而言,属性包含变量和方法:有则返回True,没有则返回False:需要注意的是n ...
随机推荐
- docker--Dockerfile--java
# AlpineLinux with a glibc-2.26-r0 and Oracle Java 7FROM alpine:3.6 MAINTAINER Anastas Dancha <an ...
- poj1850-CODE-组合
求出给定序列的序号.有一个定理需要知道 具体看这篇博客吧http://blog.csdn.net/lyy289065406/article/details/6648492 #include <c ...
- Enum 扩展
项目中,用到枚举值,并且增加中英文描述. 一般的[Description]属性,无法满足中英文,所以进行了简单扩展. 继承DescriptionAttribute,增加了英文描述description ...
- 我的G++编译选项
-Wall -Wextra -g3 -DLOCAL -Wshadow -Wpointer-arith -Wcast-qual -Waggregate-return -Winline -Wunreach ...
- hdu 6394 Tree (2018 Multi-University Training Contest 7 1009) (树分块+倍增)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=6394 思路:用dfs序处理下树,在用分块,我们只需要维护当前这个点要跳出这个块需要的步数和他跳出这个块去 ...
- Hard Rock
Ilya is a frontman of the most famous rock band on Earth. Band decided to make the most awesome musi ...
- FreeBSD ZFS
FreeBSD ZFS https://www.cnblogs.com/hadex/p/6068476.html 参考資料 http://docs.oracle.com/cd/E37934_01/ht ...
- 自学Python3.2-函数分类(内置函数)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 平衡树Splay
维护区间添加,删除,前驱,后继,排名,逆排名 普通平衡树 #include <cstdio> #define ls t[now].ch[0] #define rs t[now].ch[1] ...
- 【bzoj3064】 CPU监控
http://www.lydsy.com/JudgeOnline/problem.php?id=3064 (题目链接) 题意 给出一个长度为$n$的数列$A$,同时定义一个辅助数组$B$,$B$开始与 ...