Python-属性拦截器——__getattribute__

__getattribute__(self, item):

当一个类的属性被实例访问时,会自动调用该方法。
当实例调用属性时,比如s1.name,会把name作为实参传进__getattribute__方法中,经过一系列操作后,再把name处理后的结果返回。Python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。
所以我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等;如果重写了__getattribute__,则类会调用重写的方法,所以这个方法必须要有renturn返回值,返回传进去的属性,否则调用属性会出现失败的情况。

class ClassA:
    x = 'a'

    def __init__(self):
        self.y = 'b'

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


a = ClassA()
# 使用实例直接访问存在的类属性时,会调用__getattribute__方法
print(a.x)

# 使用实例直接访问实例存在的实例属性时,会调用__getattribute__方法
print(a.y)

# 使用实例直接访问实例不存在的实例属性时,也会调用__getattribute__方法
print(a.z)
>>>
 __getattribute__
 __getattribute__
 __getattribute__

与__getattribute__功能接近的,还有:

__getattr__(self, key):

重载__getattr__方法对类及其实例未定义的属性有效。也就是说,如果访问的属性存在,就不会调用__getattr__方法。这个属性的存在,包括类属性和实例属性。

class ClassA:

    def __getattr__(self, item):
        print('__getattr__')


a = ClassA()
a.x
>>>
__getattr__

当同时定义__getattribute__和__getattr__时,__getattr__方法不会再被调用,除非显示调用__getattr__方法或引发AttributeError异常。

class ClassA:

    def __getattr__(self, item):
        print('__getattr__')

    def __getattribute__(self, item):
        print('__getatttribute__')


a = ClassA()
a.x
>>>
__getatttribute__

__setattr__(self, key, value):

当试图给对象的key属性赋值的时候将会被调用,若属性不存在,先创建再赋值。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • python 内建属性 getattribute 是属性拦截器,当调用其他属性时,会先调用它来看看是否有调用属性值...
    Oo晨晨oO阅读 4,844评论 0 3
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 8,035评论 2 9
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,322评论 0 10
  • 体验、学习永远不会让人感动。但一定会让人成熟。 精进、成长的路上一定要有方向、我一直在寻找方向的路上曾未放弃。
    冯祥林阅读 1,265评论 0 0
  • 猴年被送走了,鸡年迎来了。今年我是在深圳市过年的,虽然这里很普通,但我玩的还是非常的快乐呢! 除夕夜,我和两个...
    俊飞阅读 1,522评论 0 0

友情链接更多精彩内容