浅谈Python 中 __getattr__与__getattribute__的区别

__getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getattr__可以用在python的所有版本中,而__getattribute__只可以用到新类型类中(New-style class),其主要的区别是__getattr__只截取类中未定义的属性,而__getattribute__可以截取所有属性,下面用代码进行说明:

(1)__getattr__

class c:
    def __init__(self,value):
        self.data=value
    def __getattr__(self,name):
        print('getattr...\n intercept %s'% name)
    @property
    def p(self):
        print(" i'm not intercepted, so you can see me")
>>> x.data
1
>>> x.a
getattr...
 intercept a
>>> x.b
getattr...
 intercept b
>>> x.p
 i'm not intercepted, so you can see me

从上面可以看出,对于类c中已定义的实例属性data,p,均显示了出来,而对于未定义的a,b都进行了拦截。

(2)__getattribute__函数

将上面的代码中的__getattr__换成__getattribute__,其他的不做变动

>>> class c:
    def __init__(self,value):
        self.data=value
    def __getattribute__(self,name):
        print('getattr...\n intercept %s'% name)
    @property
    def p(self):
        print(" i'm intercepted, so you can not see me")
>>> x=c(2)
>>> x.a
getattr...
 intercept a
>>> x.b
getattr...
 intercept b
>>> x.p
getattr...
 intercept p
>>> x.data
getattr...
 intercept data

调用实例的属性,可以发现,全部被__getattrbute__予以了拦截。

转载于:https://www.cnblogs.com/johnyang/p/10464208.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值