上海设计网站与,重庆seo搜索引擎优化平台,建设地方性宠物网站,wordpress一页主题1 python属性管理getattr、getattribute、setattr和delattr避免循环
在__getattr__()、__getattribute__()和__setattr__()方法体内#xff0c;通过self进行对应的点号运算、赋值运算#xff0c;会自动调用当前实例的相应方法#xff0c;导致无限循环。通过object或者__dic…1 python属性管理getattr、getattribute、setattr和delattr避免循环
在__getattr__()、__getattribute__()和__setattr__()方法体内通过self进行对应的点号运算、赋值运算会自动调用当前实例的相应方法导致无限循环。通过object或者__dict__可以避免循环。
NO项目方法体内避免循环1__getattr__()已定义属性attrself.attr2__getattribute__()object.__getattribuite__(self,attr)3__setattr__()object.__setattr__(self,attr,value) self.__dict__[attr]value4__delattr__()object.__delattr__(self,attr) del self.__dict__[attr]
1.1 getattr
未定义属性attr进行点号运算-实例名.attr时自动调用__getattr__()方法所以可以在方法体对已定义属性进行点号运算不会产生循环因为实例名.已定义属性不会触发__getattr__()方法。注意方法体内不能对未定义属性进行点号运算否则会产生循环。
1.1.1 self.attr触发无限循环
描述
getattr方法体内未定义属性attrself.attr点号运算触发无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __getattr__(self,attr):print(获取属性值,attr)# 未定义属性attrself.attr点号运算触发循环xself.attr lgLoopGet()lg.a
1lg.c
获取属性值 c
获取属性值 attr
获取属性值 attr
获取属性值 attr
获取属性值 attr
# 未定义属性attr实例名.attr点号运算触发循环1.1.2 访问已定义属性避免循环
描述
__getattr__拦截未定义属性的点号运算方法体内self.已定义属性拦截已定义属性来避免循环或者直接return其他值来避免循环。
示例 class LoopGet:a1def __init__(self):self.b2def __getattr__(self,attr):print(获取属性值,attr)# 已定义属性attrself.attr点号运算不调用 __getattr__ 避免循环xself.a lgLoopGet()lg.c
获取属性值 c1.2 getattribute
未定义属性、已定义属性attr进行点号运算-实例名.attr时都会自动调用__getattribute__()方法所以在方法体通过self.属性对其他属性进行点号运算时会触发__getattribute__()导致产生循环。通过object.__getattribute__()避免无限循环。
1.2.1 self.attr触发无限循环
描述
getattribute方法体内self.属性名自动调用当前实例的getattribute导致无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __getattribute__(self,attr):print(获取属性值,attr)# 已定义属性attrself.attr点号运算触发循环xself.blgLoopGet()lg.a
获取属性值 a
获取属性值 b
获取属性值 b
获取属性值 b
#无限循环获取属性 b class LoopGet:a1def __init__(self):self.b2def __getattribute__(self,attr):print(获取属性值,attr)# 未定义属性attrself.attr点号运算触发循环xself.attr lgLoopGet()lg.a
获取属性值 a
获取属性值 attr
获取属性值 attr
获取属性值 attr
#无限循环获取属性 attr1.2.2 self.__dict__触发无限循环
描述
getattribute方法体内self.__dict__自动调用当前实例的getattribute导致无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __getattribute__(self,attr):print(获取属性值,attr)# self.__dict__ 触发 __getattribute__ 导致循环xself.__dict__[attr] lgLoopGet()lg.a
获取属性值 a
获取属性值 __dict__
获取属性值 __dict__1.2.3 object.getattribute()避免循环
描述
getattribute方法体内object.__getattribute__(self,attr)自动调用超类object的getattribute避免无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __getattribute__(self,attr):print(获取属性值,attr)# object全部类的超类通过 object.__getattribute__ 避免循环return object.__getattribute__(self,attr) lgLoopGet()lg.a
获取属性值 a
1lg.c
获取属性值 c
Traceback (most recent call last):File pyshell#19, line 1, in modulelg.cFile pyshell#16, line 8, in __getattribute__return object.__getattribute__(self,attr)
AttributeError: LoopGet object has no attribute c1.3 setattr
未定义属性或已定义类属性或已定义实例属性为attr实例名.attrvalue自动调用python的__setattr__()方法。在setattr方法体内self.attrvalue自动调用当前实例的setattr导致无限循环。通过self.__dict__[attr]value、object.__setattr__(self,attr,value)来避免无限循环。
__delattr__()和__setattr__()使用相同的方法来避免循环。
1.3.1 self.attrvalue触发无限循环
描述
setattr方法体内self.attrvalue自动调用当前实例的setattr导致无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __setattr__(self,attr,value):print(设置属性值,attr)# self.attr 触发 __getattribute__ 导致循环self.attrvalue# 构造函数的 self.b2 调用 setattr方法体内 self.attrvalue 触发无限循环 lgLoopGet()
设置属性值 b
设置属性值 attr
设置属性值 attr
设置属性值 attr1.3.2 self.dict[attr]value避免循环
描述
__setattr__()方法体内self.__dict__[attr]value不调用setattr避免循环。
示例 class LoopGet:a1def __init__(self):self.b2def __setattr__(self,attr,value):print(设置属性值,attr)# self.__dict__[attr]value 不调用 __getattribute__ 避免循环self.__dict__[attr]value lgLoopGet()
设置属性值 blg.a11
设置属性值 alg.b3
设置属性值 blg.c5
设置属性值 clg.c
51.3.3 object.setattr(self,attr,value)避免循环
描述
__setattr__()方法体内object.__setattr__(self,attr,value)自动调用超类object的setattr避免无限循环。
示例 class LoopGet:a1def __init__(self):self.b2def __setattr__(self,attr,value):print(设置属性值,attr)# object.__setattr__(self,attr,value) 调用超类setattr 避免循环object.__setattr__(self,attr,value) lgLoopGet()
设置属性值 blg.a11
设置属性值 alg.b3
设置属性值 blg.c5
设置属性值 clg.c
51.4 delattr
del 实例名.attr自动调用python的__delattr__()方法。在setattr方法体内del self.attr自动调用当前实例的delattr导致无限循环。
通过del self.__dict__[attr]、object.__delattr__(self,attr)来避免无限循环。
注只能删实例属性不能删类属性。
1.4.1 del self.attr触发无限循环
描述
__delattr__()方法体内del self.attr自动调用当前实例的delattr导致无限循环。
示例 class LoopDel:a1def __init__(self):self.b2def __delattr__(self,attr):print(删除属性,attr)# del self.attr 调用当前实例的 delattr 导致循环del self.attr ldLoopDel()del ld.a
删除属性 a
删除属性 attr
删除属性 attr
删除属性 attr
删除属性 attr1.4.2 del self.dict[attr]避免循环
描述
__delattr__()方法体内del self.__dict__[attr]不调用delattr避免循环。
注只能删实例属性不能删类属性。
示例 class LoopDel:a1def __init__(self):self.b2def __delattr__(self,attr):print(删除属性,attr)# del self.__dict__[attr] 不调用 delattr 避免循环# 只能删 实例属性 不能删类属性del self.__dict__[attr] ldLoopDel()
# 删实例属性del ld.b
删除属性 b
# 删类属性失败del ld.a
删除属性 a
Traceback (most recent call last):File pyshell#64, line 1, in moduledel ld.aFile pyshell#60, line 9, in __delattr__del self.__dict__[attr]
KeyError: a1.4.3 object.__delattr(self,attr)避免循环
描述
__delattr__()方法体内object.__delattr__(self,attr)自动调用超类object的delattr避免无限循环。
注只能删实例属性不能删类属性。
示例 class LoopDel:a1def __init__(self):self.b2def __delattr__(self,attr):print(删除属性,attr)# object.__delattr__(self,attr) 调用超类 delattr 避免循环# 只能删 实例属性 不能删类属性object.__delattr__(self,attr) ldLoopDel()del ld.b
删除属性 bdel ld.a
删除属性 a
Traceback (most recent call last):File pyshell#69, line 1, in moduledel ld.aFile pyshell#66, line 8, in __delattr__object.__delattr__(self,attr)
AttributeError: a