本文主要是介绍python中的__dict__,__getattr__,__setattr__,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
python class 通过内置成员dict 存储成员信息(字典)
首先用一个简单的例子看一下dict 的用法
class A():def __init__(self,a,b):self.a = aself.b = bdef f(self):print (self.__dict__)
a = A(1,2)
a.f()
输出结果:{‘b’: 2, ‘a’: 1}
我们可以通过重载getattr和setattr来拦截对成员的访问或者作出一些自己希望的行为
getattr 在访问对象访问类中不存在的成员时会自动调用
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A():def __init__(self,a,b):self.a = aself.b = bdef f(self):print (self.__dict__)def __getattr__(self,name):print ("__getattr__")
a = A(1,2)
a.f()
a.x
setattr 方法
class A(object):def __init__(self,a,b):print('start init')self.a=a #赋值语句会被__setattr__拦截self.b=bprint('end init')def f(self):print(self.__dict__)#因为赋值语句被拦截,所以不能将内置成员存储成(字典)def __getattr__(self, name):print('__getattr__')def __setattr__(self, name,value):print('1__setattr__')self.__dict__[name]=valueprint('2__setattr__')
a=A(2,3)
print('---------')
a.aa=33
运行结果
如下:
start init
1__setattr__
2__setattr__
1__setattr__
2__setattr__
end init
---------
1__setattr__
2__setattr__
__setattr__
会拦截所有属性的的赋值语句。如果定义了这个方法,self.arrt = value 就会变成self,__ setattr__(“attr”, value).这个需要注意。
当在__ setattr__方法内对属性进行赋值是,不可使用self.attr = value,因为他会再次调用self,__ setattr __(“attr”, value),则会形成无穷递归循环,
最后导致堆栈溢出异常。应该通过对属性字典做索引运算来赋值任何实例属性,也就是使用self.dict[‘name’] = value
如:j.name=5 就会调用__ setattr__方法 self.[name]=5
因为这个类是从dict继承来的,是dict的超类
所以 self[attr]=value 相当于调用dict的下标方法
与 a={} ; a[attr]=value意思一样
注意:是拦截实例的赋值,类的赋值不能拦截
这篇关于python中的__dict__,__getattr__,__setattr__的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!