浅谈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__予以了拦截。

posted @   JohnYang819  阅读(1084)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示