Python - __getattr__和__getattribute__的区别

传送门

  1. https://docs.python.org/3/reference/datamodel.html#object.__getattr__
  2. https://docs.python.org/3/reference/datamodel.html#object.__getattribute__
  3. https://stackoverflow.com/questions/4295678/understanding-the-difference-between-getattr-and-getattribute
  4. https://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute

区别

  1. 当正常访问属性失败,即f.x,x不存在,会触发__getattr__
  2. 无论有无f.x,都会触发__getattibute__

Talk is cheap

__getattr__单个出现

class Foo:
    
    def __init__(self, x):
        self.x = x

    def __getattr__(self, item):
        #return self.__dict__[item]
        return '__getattr__'

f1 = Foo(1)
print(f1.x)
print(f1.xxxxxx)    #访问不存在的属性访问,触发__getattr__

1310818-20180719100048578-929019596.png

__getattribute__单个出现

class Foo:

    def __init__(self, x):
        self.x = x

    def __getattribute__(self, item):
        return '__getattribute__'


f1 = Foo(1)
print(f1.x)     # 访问存在的属性,也会直接执行__getattribute__
print(f1.xxx)   # 访问不存在的属性,也会直接执行__getattribute__

1310818-20180719100303457-1108338822.png

__getattr__和__getattibute__同时存在

class Foo:

    def __init__(self, x):
        self.x = x

    def __getattr__(self, item):
        return '执行的是我,__getattr__'
        # return self.__dict__[item]

    def __getattribute__(self, item):
        print('不管属性是否存在,我都执行,__getattribute__')
        raise AttributeError('__getattribute__的AttributeError')
        

f1 = Foo(1)
#  当两者同时存在的时候,只会执行__getattribute__;如果在__getattribute__过程中抛出AttributeError,那么就执行__geattr__
print(f1.x)     
# print(f1.xx)

1310818-20180719101243043-692923583.png

18+ Warning

最好不要使用__getattribute__,不然有可能导致无限递归的可能。

转载于:https://www.cnblogs.com/allen2333/p/9334256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值