__getattr__魔术方法:

在访问一个对象的某个属性的时候,如果这个属性不存在,那么就会执行__getattr__方法,将属性的名字传进去。

这个魔术方法在某一个模块的更新迭代中很常见,警告开发者后面的迭代中可能某个属性不在使用

其中item代表传入的属性

__setattr__魔术方法:

只要给一个对象的属性设置值,那么就会调用这个方法。但是要注意的是,不要在这个方法中调用self.xxx=xxx的形式,因为self.xxx就会触发调用__setattr__魔术方法,因为会产生递归调用。如果想要给对象的属性设置值,那么应该使用__dict__这个魔术属性。

执行3次的原因是__init__中也调用了一次

可以使用这个方法来判断是否成年等等

__getattribute__魔术方法:

这个魔术方法是,只要你访问了一个对象的属性,不管这个属性存不存在都会去执行这个方法,所以在写这个方法的时候要小心循环调用。这个方法只能在新式类中使用,不能在旧时类中使用。

在返回的时候必须使用父类的调用方法,不然会有递归调用

__getattr____getattribute__区别:

__getattr__只会在属性存在的时候调用,另一个不管是否存在都会调用