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。

原文地址:https://www.cnblogs.com/wangyi0419/p/12592492.html