先开始记录一些
有2个属性的访问方法
__getattr__和__getattribute__
有什么区别呢?
__getattr__: 用于表示访问不存在的属性的行为
__getattribute__:用于表示访问类的属性的行为
自己写个例子来实际看一下
我们可以看到,通过重写魔法方法,我们能看到2种访问属性的方法被调用的先后顺序
__getattribute__下面那个调用super()的目的是,调用原始的属性访问方法,以显示在getattribute访问不到的情况下,调用getattr函数的情况!
下面一题是写一个类代码,使下面内容可以通过
自己重写了__getattr__和__setattr__两个魔法方法,但是发现实现不了,后来观察发现,他是在第一次调用不存在的属性的时候,返回FishC的
所以应该是__getattr__里面有一句要返回出FishC的
这里注意,如果不写self.name='FischC'的话,写成print ('FishC'),那么getattr里面不能写return self.name这一句,不然会进入死循环,原因是,return的后面这句话实际上又是在访问了name这个不存在的属性,然后就等于又调用了一遍print函数
具体可以看下面第二张图里面的测试
我们可以看到,如果是print的话,他在return的时候又等于访问了一遍,然后又去调用getattr这个函数了,再又打印了一遍,进入死循环