魔法方法:属性访问

__getattr__(self, name)

-定义当用户试图获取一个不存在的属性时的行为

__getattribute__(self, name)

-定义当该类的属性被访问时的行为

__setattr__(self, name, value)

-定义当以恶搞属性被设置时的行为

__delattr__(self, name)

-定义当一个属性被删除时的行为


上图中显示了各个魔法方法被调用的先后顺序。

但是使用时有个问题,可能会陷入死循环。如下所示:


原因是:在__init__()函数中,当执行self.width = width这一句时,会自动调用__setattr__()方法,而__setattr__()方法里面经过判断,发现name不等于‘square’,于是执行else:

self.name = value. 但是当执行这个赋值语句时,又导致自动调用了__setattr__方法,于是进入了死循环。

解决方案一:

在__setattr__()函数中,调用super.__setattr__(),这样就不会进入递归的死循环中。如下图所示:


解决方案二:

对象有一个特殊属性: __dict__,dict存有对象的所有属性和其对应的值。因此可以直接改这个dict属性



更加推荐解决方案一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值