Python笔记:__getattribute__,__setattr__,__delattr__等方法容易陷入死循环

在执行以下程序时,陷入死循环:

class Rectangle:
    def __init__(self, width=0,height=0):
        self.width = width
        self.height = height

    def __setattr__(self,name,value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            self.name = value
            
    def getArea(self):
        return self.width * self.height

r1 = Rectangle(3,4)


r2 = Rectangle()
r2.square = 5

print(r1.getArea())
print(r2.getArea())

self.name = value 本句会出现死循环,因为在实例化对象时,init()构造器内部赋值操作会除法__setattr__方法,当执行到self.name = value时,赋值行为会触发__setattr__函数,然后会继续执行函数里的代码,继而再次触发__setattr__函数,这就成了一个不可解的死循环。

解决方法有如下两种:
方法①:我们去调用系统写好的基类,系统的总是最安全的!super()可以帮你找到所有函数的父类,在元素没有基类的情况下super()函数会默认为python的object类;
方法②:__dict__它的作用是以字典的属性显示出当前对象的所有属性以及对应的值!比如:{‘width’: 3};

同样的,getattribute:是定义该属性被访问时的方法,delattr:定义属性被删除时的方法。
按照上面方式重写方法时,__getattribute__会一直获得,__delattr__会一直删除而陷入死循环,而他们的解决方法,和上面写的一样,有两种方法,都可以选择使用。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值