Effective Python Ver2.0_StudyNotes___getattr__、__getattribute__及__setattr__的一些知识点

2021/9/7 1:06:43

本文主要是介绍Effective Python Ver2.0_StudyNotes___getattr__、__getattribute__及__setattr__的一些知识点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

__getattr__:每当访问类对象的属性,此时实例字典又找不到该属性时,触发__getattr__,简言之:访问实例化对象没有的属性时触发
__getattribute__:主要访问对象中的属性就会触发此方法
__setattr__:只要给对象进行属性赋值操作就会触发此方法,无论是直接赋值还是通过setattr函数赋值

这里有个技巧需要知道,如果想要访问属性或者设置属性赋值的过程不触发 __ ** __ 方法,可以使用super().__getattr__('name')super().__getattribute__('name')super().__setattr__('key', 'value')来处理。

示例:

class DictionaryRecord:
    def __init__(self, data):
        self._data = data
        self.a = 1

    def __getattribute__(self, item):
        print(f"call __getattribute__({item !r})")
        data_dict = super().__getattribute__('_data')  # 超类的__getattribute__方法是直接从实例的属性字典获取的,不会触发__getattritube__
        return data_dict[item]

    def __setattr__(self, key, value):
        print(f"__setattr__ is run...")
        print(key, value)
        super().__setattr__(key, value)

data = DictionaryRecord({'foo': 3})
print(data.foo)

Result:
setattr is run...
_data {'foo': 3}
setattr is run...
a 1
call getattribute('foo')
3



这篇关于Effective Python Ver2.0_StudyNotes___getattr__、__getattribute__及__setattr__的一些知识点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程