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 ...
随机推荐
- Nginx REWRITE阶段
rewrite_log on ;#每次rewrite都会记录一条记录在errorlog里 error_log logs/xxx.log notice; location /first { rewrit ...
- linux 内核参数优化----最大线程数限制及当前线程数查询
1.总结系统限制有: /proc/sys/kernel/pid_max #查系统支持的最大线程数,一般会很大,相当于理论值 /proc/sys/kernel/thread-max max_user_p ...
- Hopcroft-Carp 算法模板 自用
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #d ...
- day31 configparser 配置文件模块
#__author__: Administrator #__date__: 2018/8/8 # configparse 生成配置文件,配置文会以件.ini结尾 # 对于格式有要求 # 创建配置文档 ...
- 【BZOJ2245】[SDOI2011]工作安排(费用流)
[BZOJ2245][SDOI2011]工作安排(费用流) 题面 BZOJ 洛谷 题解 裸的费用流吧. 不需要拆点,只需要连边就好了,保证了\(W_j<W_{j+1}\). #include&l ...
- FreeRTOS 中 systick 相关配置
@2018-7-16 > systick 属性配置 在文件 <port.c> 中函数 void vPortSetupTimerInterrupt( void ) 中配置计数周期.时钟 ...
- luogu4181 [USACO18JAN]Rental Service (贪心)
我们要出租的话,一定是出租产奶量最少的牛 那我们就看出租多少头牛(其他的卖奶)的时候答案最大就可以了. (注意N有可能小于R) #include<bits/stdc++.h> #defin ...
- A1032. Sharing
To store English words, one method is to use linked lists and store a word letter by letter. To save ...
- CodeForces786B 线段树 + 最短路
给定n颗行星,q次处理,地球位置为s,求解在q次处理后,地球到每一颗行星的位置. 其中q有三种不同的操作: 输入v,u,wv,u,w,构建一条从vv到uu的代价为ww的路线 输入u,l,r,wu,l, ...
- excel自动化翻译2
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...