__get__, __getattribute__,__getattr__

本篇主要讲一下__getattribute__, __getattr__,__get__的执行顺序

#!/usr/bin/env python
# coding:utf-8


class Account:
    user_name = 'andy'

    def __get__(self, instance, owner):
        print('作为类属性时被访问时,无条件经过我')
        print(instance, owner)
        return self

    def __getattribute__(self, item):
        print('访问属性时,无条件经过我')
        return object.__getattribute__(self, item)

    def __getattr__(self, item):
        print('当__getattribute__失败时经过我')


class UserAccount(Account):
    account = Account()


if __name__ == '__main__':
    u = UserAccount()
    # print(u.user_name)
    print(u.account)
"""    
访问属性时,无条件经过我
作为类属性时被访问时,无条件经过我
<__main__.UserAccount object at 0x7f641ee7ff60> <class '__main__.UserAccount'>
<__main__.Account object at 0x7f641eef4630>
"""

总结就是: 当获取属性时,无条件走__getattribute__,当属性获取失败,异常时,会尝试走__getattr__,相当于后备手段(不知是不是通常所说的防御型编程)。而__get__则针对当前类作为另一个类的类属性时调用,但注意:因为__getattribute__在获取属性(包括类属性)时无条件执行,所以会先走__getattribte__,从它执行的结果可以看到,先执行了__getattribute__,再是__get__

上一篇:关于学习

下一篇:Elasticsearch 基础