这两个函数对于python初学者来说都不太好理解,想要弄懂函数机制还需多看代码,多敲几遍,反复运行。当我们在类中重写__getattribute__()函数后,不论类实例的属性是否在类中定义,编译器都执行__getattribute__()的函数行为。如果我们只重写__getattr__()函数(没有__getattribute__()),那么如果类实例的属性在类中存在,编译器则不会调用__getattr__()函数,如果不存在,则会调用__getattr__()函数。如果两个重写函数同时存在,编译器会先执行__getattribute__()函数,再执行__getattr__()函数。
注意__getattribute__()函数要有返回值,如果没有返回值,则程序会返回None,可能达不到编程者的编程目的。
显然属性year在类中定义过,执行__getattribute__()中的if语句。
而属性month并没有出现在class Date中,但是__getattribute__()仍然被执行。
这里只重写了__getattr__()
显然属性year在类中定义过,所以编译器不会调用__getattr__()函数。
属性month并没有出现在类中,所以编译器开始调用__getattr__()函数。