Python自定义属性访问

object.__getattr__(self, name)

该方法在使用通常属性查找未找到时调用(即它不是实例属性,也不在类树中找到 )。
name是属性名称。此方法应返回(计算)属性值或引发AttributeError异常。

object.__getattribute__(self, name)

该方法会在实例的属性访问时调用。
如果类也定义了__getattr__() ,则__getattr__() 会在__getattribute__() 明确地调用它或者引发AttributeError时才会被调用。
__getattribute__()方法应返回(计算)属性值或引发AttributeError异常。
为了避免这种方法的无限递归,它的实现应该始终使用相同的名称调用基类方法来访问它需要的任何属性,例如。

class dict_alt(object):
    base = {}
    def __getattribute__(self, name):
        if name == 'test':
            return "hello"
        elif name[:4] == 'test':
            print("no more test")
            raise AttributeError("'dict_alt' object has no attribute %s" % name)
        elif name == 'dict':
            return object.__getattribute__(self, 'base')
        else:
            return self.dict.__getattribute__(name)
    def __getattr__(self, name):
            return "Hi, This is Joke"
if __name__ == '__mian__':
    d = dict_alt()
    print(d.test)
    # hello
    print(d.test_another)
    # no more test
    # Hi, This is Joke
    d.dict[2]=3
    print(d.dict)
    # {2:3}
    print(d.get(2))
    # 3

object.__setattr__(self, name, value)

该方法在尝试进行属性分配时调用。会代替正常的存储机制(即将实例字典中的值存储)。 name是属性名称,value是要分配给它的值。 如果__setattr __()要分配给一个实例属性,它应该调用具有相同名称的基类方法,例如object.__setattr__(self, name, value)。

object.__ delattr__(self, name)

用法类似__setattr__(),用于属性删除操作。在对象的del obj.name有意义的情况下使用。

class dict_alt(object):
    base = {}
    def __setattr__(self, name, value):
        if name in object.__dir__(self, name):
            object.__setattr__(self, name, value):
        else:
            self.base[name] = value
    
    def __getattr__(self, name):
        if name in self.base:
            return self.base[name]
        else:
            raise AttributeError("'dict_alt' object has no attribute %s" % name)

    def __delattr__(self, name):
        if name in object.__dir__(self, name):
            del object.name
        elif name in self.base:
            del self.base[name]
        else:
            raise AttributeError("'dict_alt' object has no attribute %s" % name)
            

if __name__ == '__main__':
    d = dict_alt()
    d.C = 4
    d.a = 12
    print(d.base)
    # {'C': 4, 'a': 12}
    print(d.C)
    # 4
    print(d.a)
    # 2

object.__dir__(self) 在对象上调用dir()时调用。必须返回一个序列。 dir()将返回的序列转换为列表并进行排序。

详细请参考:
3. Data model — Python 3.6.2 documentation Customizing attribute access

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容