美文网首页
Python自定义属性访问

Python自定义属性访问

作者: slords | 来源:发表于2017-08-07 09:42 被阅读0次

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

相关文章

  • Werkzeug的Local系列(1) - 属性__setatt

    Python类有哪些属性 输出结果: 可以看到一些平时很少用到的内置方法 自定义属性访问 在Python3的自定义...

  • Python自定义属性访问

    object.__getattr__(self, name) 该方法在使用通常属性查找未找到时调用(即它不是实例属...

  • HTML5 自定义属性

    自定义属性:添加前缀“data-” dataset属性:添加自定义属性后,通过元素的dataset属性来访问自定义...

  • Kotlin技术之属性

    (1)自定义属性访问器: 所谓自定义属性访问器顾名思义,在我们定义属性的时候,比如定义一个变量属 性再给它附上相应...

  • 2018-07-25

    一、访问元素的属性 A.核心Dom B.HTML Dom C.自定义属性: 案例 div属性 去百度 自定义...

  • Kotlin与Java混合开发(3)✔️Java调用Kotlin

    访问 Kotlin 属性访问包级别成员使用 文件名 访问使用 @file:JvmName("自定义名") 访问实例...

  • Python的属性搜索

    这是我总结的Python属性搜索的加长版,完整的描述了Python在做属性访问时的过程。了解Python属性搜索的...

  • Python 属性访问机制

    简介 Python 中,一切皆对象。 当我们访问某个对象属性时,在不同的情况下,Python 对属性的访问机制有所...

  • python 自定义属性的访问机制

    内置函数: setattr :给对象设置属性getattr:获取对象竖属性值delattr :删除对象属性值

  • 无处安放

    1、取消a标签的默认行为 2、自定义属性的操作 访问:元素.getAttribute(属性名);设置属性:元素.s...

网友评论

      本文标题:Python自定义属性访问

      本文链接:https://www.haomeiwen.com/subject/kqkwlxtx.html