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__,否则不会执行。

 

 

 

 

 

posted @ 2020-03-29 15:23  天青色wy  阅读(374)  评论(0编辑  收藏  举报