常见的属性访问BIF及其对应的魔法方法:获取、赋值、删除

1.getattr(object, name[, default]):获取对象的某个属性值

补充:私有变量就是将变量名换一个隐藏起来,但是更改后的变量名是有规律的,也就是下划线+类名+双下划线+变量名就可以实现对其的访问,那么它对应的魔法方法是什么呢?肯定有人会说__getattr__(self,name),但实际上呢,是__getattribute__(self,name),下面就简要介绍一下两个魔法方法,仔细看喔

__getattribute__(self,name):当用户去访问一个属性的时候就会触发该方法里的内容(不管使用什么方法来获取),简单来说就是一个属性访问时的拦截器,任何访问类里面属性的操作都会先调用__getattribute__里的内容

 __getattr__(self,name):这个魔法方法也和属性的获取有关,但是这个方法是当用户去获取一个不存在的属性时会触发

你看,如果我去获取“小猫”的话,就会弹出if里的内容

2.setattr(object, name, default=None):设定对象中指定属性的值,object是对象,name是属性,default:默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError,返回值是对象的属性值,如果default的值和原来设定的值不同,那么会覆盖原值

 那么,它对应的魔法方法是什么呢?没错啦,就是__setattr__,它会给属性赋值,检测到赋值操作的时候,执行方法里的内容

咦?不是赋值操作嘛,为什么就报错了呢?

可以看出1022 more times,说明代码触发了无限循环,为什么会出现无限循环呢?答案就在__setattr__的定义里,既然是检测到赋值就执行,那么self是对象自身,捕获道到赋值操作时会执行self.name = value 相当于给自己进行了一次赋值操作,在方法内部有循环返回来又会执行这个方法,就等于一直在__setattr__的内容里循环,由于无限循环的赋值操作会让__setattr__方法使用无数次,陷入了死循环 

解决办法就是使用字典dict,对象的属性和值都是用字典的形式来保存的,通过下面的代码可知👇__dict__里面存放的就是这个对象的属性和值的键值对,name是属性,value是值

这样就可以完成在__setattr__里面赋值了! 

3.delattr(object,name):这个BIF想必大家都很熟悉了,就是删除对象里面的属性

可以看到,当我们试图去使用hasattr去获取这个属性时返回了False,说明对象里面已经没有这个属性了,被delattr删除了

那么,它对应的魔法方法显而易见,就是__delattr__(self,item),利用字典来实现属性的删除,item是字符串,表示被删除属性的名字,当它检测到删除操作的时候就会调用__delattr__方法里的内容

 当python抛出“正在删除中...”时,我们就已经可以知道__delattr__触发了

如果有不小心说错的地方或者要补充的内容,欢迎评论

好啦,这就是获取、赋值、删除三种最最常见的函数和它们对应的魔法方法,其实魔法方法还有很多,比如__setitem__、__getitem__、__iter__等等,后面有机会的话也会陆续发布的,感谢大家的支持(手动狗头

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值