python中对象的Attribute拦截__getattribute__()
之前一直有个疑惑,访问一个对象中的未定义的属性和方法时报的错误信息都是一样的AttributeError:
明明调用的是方法haha()却说是属性。后来发现python的基类中有个内建方法__getattribute__(),当访问某个实例的属性或方法时就会调用这个内建方法,再在里面返回对应的属性或方法的引用。
如上,当执行t.func()时,先调用__getattribute__()方法,将func当成字符串“func”传进去,查找匹配后返回方法func的引用。再在后面加个()就可以调用执行了。
注意:__getattribute__()有个坑,就是return 后面不能直接写self.属性名,不然会循环调用getattribute方法出不来了,会报错:
RecursionError: maximum recursion depth exceeded while calling a Python object。
如果同时重写了__getattr__() 和 __getattribute__(),只要调了基类的__getattribute__并且当找不到属性时就会执行A中的__getattr__,否则不会执行。