python setattr 代码可读性_python __setattr__、__getattr__、__getattribute__全面详解

一、属性引用函数

hasattr(obj,name[,default])

getattr(obj,name)

setattr(obj,name,value)

delattr(obj,name)

二、属性引用重载

def __setattr__(self,key,value):

1.拦截所有属性的赋值语句。

2.self.attr=value 相当于 self.__setattr__("attr",value)。

3.如果在__setattr__中对任何self属性赋值,都会再调用__setattr__,导致无穷递归循环。只能self.__dict__["attr"]=value 。

def __getattribute__(self, key):

1.拦截所有的属性获取,包括未定义的属性,self.__dict__,等点号运算。

2.所有的属性先在__getattribute__中没有找到,就会抛出AttributeError,__getattr__接收这个错误,此时进入__getattr__中继续寻找。

3.如果__getattribute__没有抛出AttributeError,将不会调用__getattr__。

def __getattr__(self, key):

拦截self.attr运算。当在__dict__中未找到该属性时,在类属性中也没有找到该属性,并且在继承树中也没有找到该属性,就会调用这个方法。

def __delattr__(self,key): 删除属性

三、示例

class Square: #正方形

def __init__(self, l):

self.length= l #边长

def __getattr__(self, key):if key == "area":return "__getattr__被调用了,为了area"sq= Square(10)print(sq.length) #10

print(sq.area) #__getattr__被调用了,为了area

class Square: #正方形

def __init__(self, l):pass

def __getattr__(self, key):print("__getattr__被调用了")if key == "length":return 1111

def __getattribute__(self, key123):print("__getattribute__被调用了")#return 123456

raiseAttributeError

sq= Square(10)print(sq.length)#__getattribute__被调用了#__getattr__被调用了#1111

class Square: #正方形

def __init__(self,l):pass

def __getattr__(self, key):print("__getattr__被调用了")raise AttributeError("1111111")def __getattribute__(self, key123):print("__getattribute__被调用了")return 123456

#raise AttributeError

sq= Square(10)print(sq.length)#__getattribute__被调用了#123456

class Square: #正方形

def __init__(self, l):

self.length= l #边长

def __setattr__(self, key, value):print("调用__setattr__", "key=", key)if key == "perimeter":

self.__dict__["length"] = value / 4self.__dict__["perimeter"] =valueif key == "length":

self.__dict__["length"] =value

self.__dict__["perimeter"] = value * 4

def __getattr__(self, key):print("调用__getattr__ ,", "key =", key)if key == "area":return 960

def __getattribute__(self, key123):print("调用__getattribute__ ,", "key123 =", key123)return object.__getattribute__(self, key123)

sq= Square(10)#调用__setattr__#调用__getattribute__ , key123 = __dict__ 此时执行self.__dict__["length"] = value#调用__getattribute__ , key123 = __dict__ 此时执行self.__dict__["perimeter"] = value * 4

print(sq.length)#调用__getattribute__ , key123 = length 此时执行self.length = l # 边长

print(sq.perimeter)#调用__getattribute__ , key123 = perimeter#40

print(sq.area)#调用__getattribute__ , key123 = area#调用__getattr__ , key = area#960

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
和__getattribute__函数是什么?它们的作用是什么? __getattr__是Python中的一个特殊方法,用于在访问一个不存在的属性时触发。当我们尝试访问一个对象的属性,而该属性不存在时,Python会调用__getattr__方法来处理这个请求。可以在__getattr__方法中自定义对不存在属性的处理逻辑,比如返回默认值或抛出异常。 __setattr__是Python中的另一个特殊方法,用于在给对象的属性赋值时触发。当我们对一个对象的属性进行赋值时,Python会调用__setattr__方法来处理这个赋值操作。可以在__setattr__方法中自定义对属性赋值的行为,比如进行一些额外的操作或进行属性值的验证。需要注意的是,在__setattr__方法中对属性进行赋值时,应该调用父类的__setattr__方法来避免引起无限递归。 __getattribute__是Python中的另一个特殊方法,用于获取对象的属性值。当我们尝试获取一个对象的属性时,不论这个属性是否存在,Python都会调用__getattribute__方法来处理这个请求。可以在__getattribute__方法中自定义对属性的获取行为,比如进行一些额外的操作或返回特定的属性值。需要注意的是,在__getattribute__方法内部访问属性时,应该使用super().__getattribute__方法来避免引起无限递归。 总结一下: - __getattr__用于处理访问不存在属性的情况,可以自定义对不存在属性的处理逻辑。 - __setattr__用于处理属性赋值的情况,可以自定义对属性赋值的行为。 - __getattribute__用于获取属性的值,可以自定义对属性获取的行为。 参考资料: 属性相关:__getattr__函数、__setattr__函数、__getattribute__函数、__setattribute__函数和__dir__函数: - 知乎 (zhihu.com) 引用中的代码示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值