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__等等,后面有机会的话也会陆续发布的,感谢大家的支持(手动狗头