美文网首页
python对属性的搜索优先级

python对属性的搜索优先级

作者: 冯斯特罗 | 来源:发表于2017-04-20 15:11 被阅读237次

当获取元素的时候,实际上调用的是object.__getattribute__(key)
所谓的搜索优先级实际上是object.__getattribute__(key)实现的

Data Descriptor和Non-data Descriptor的不同体现在关于实例字典条目的覆盖和计算顺序上。如果实例字典中包含了与Data Descriptor同名的属性,那么Data Descriptor优先。如果实例字典中包含了与Non-data Descriptor同名的属性,实例字典优先。
同时定义__get__()和__set__()方法,并且__set__()在调用时抛出AttributeError异常,就可以创建一个只读的Data Descriptor。只需要定义一个抛出异常的__set__()方法就足以让该对象成为Data Descriptor。

方法实际上是一个非数据描述符。

下面是object.__getattribute__(key)的伪代码和一些实例,随意把玩。

class demo(object):# 非数据描述符
    def __init__(self, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs

    def __get__(self, instance, owner):
        return owner.__dict__[type(self).__name__](instance, *self.args, **self.kwargs)

class Descriptor(object):
    def __get__(self, instance, owner):
        return 'Descriptor'
    def __set__(self, instance, value):
        pass
class FOO(object):
    def __getattr__(self, item):
        return '__getattr__'
    def __init__(self, *args, **kwargs):
        pass
    # attr = Descriptor()
    demo = demo()
    # def demo(self):
    #    pass
    def __del__(self):
        pass
foo = FOO(1, 2, 3)

# foo.attr = 'instance attr'
# FOO.attr = 'class attr'
# type(foo).__dict__['attr'].__get__(foo, type(foo))
# FOO.__dict__['attr'].__get__(None, FOO)
print foo.attr
print FOO.attr

print FOO.__dict__['demo'] # <function demo at 0x02F67B30>
print FOO.demo # <unbound method FOO.demo>
print foo.demo # <bound method FOO.demo of <__main__.FOO object at 0x02F69E30>>

print FOO.__dict__['demo'].__get__(None, FOO) == FOO.demo #True
print type(foo).__dict__['demo'].__get__(foo, type(foo)) == foo.demo # #True


object.__getattribute__(key)的伪代码

def __getattribute__(self, key):
    # self是一个类
    if type(type) == type(self):
        pass
        # 和实例类似,区别1,但是没有__getattr__2,针对非数据描述符的处理方式是不同的。(unbound method)
    # self是一个实例
    else:
        # 数据型描述符
        _attr = type(self).__dict__.get(key)
        if _attr and hasattr(_attr, '__get__') and hasattr(_attr, '__set__'):
            _value = type(self).__dict__[key]
            if hasattr(_value, '__get__'):
                return _value.__get__(self, type(self))
            return _value
        del _attr
        # 实例属性
        _attr = self.__dict__.get(key)
        if _attr:
            return _attr
        del _attr
        # 非数据描述符
        _attr = type(self).__dict__.get(key)
        if _attr and hasattr(_attr, '__get__'):
            _value = type(self).__dict__[key]
            if hasattr(_value, '__get__'):
                return _value.__get__(self, type(self))
            return _value
        del _attr
        # 类属性
        _attr = type(self).__dict__.get(key)
        if _attr:
            return _attr
        # 父类属性
        for FClass in self.__class__.__mro__:
            _attr = FClass.__dict__.get(key)
            if _attr:
                return _attr
        # __getattr__
        if hasattr(self, '__getattr__'):
            return self.__getattr__(key)
        else:
            raise AttributeError('type object "{1}" has no attribute "{2}"'.format(str(self.__class__), key))

相关文章

  • python对属性的搜索优先级

    当获取元素的时候,实际上调用的是object.__getattribute__(key)所谓的搜索优先级实际上是o...

  • Python类中属性搜索的顺序

    Python类中属性搜索的顺序 在传统类中(默认类,直到Python3),属性搜索处理对所有路径深度优先,直到继承...

  • Python的属性搜索

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

  • python 调用selenium备忘

    python打开selenium 浏览器设置 webdriver 重要属性 搜索网页元素 获取元素属性 动作模拟 ...

  • 类属性和实例属性的查找顺序

    类属性:定义在类内部的变量和方法,统称为属性。 查找顺序 - MRO 查找 Python 的属性搜索算法,在 Py...

  • python模块

    引入 引入模块时的优先级1、当前目录2、如果不在当前目录,Python 则搜索在 shell 变量 PYTHONP...

  • Python高级编程—描述符Descriptor超详细讲解上

    Python高级编程——描述符Descriptor超详细讲解(上篇之属性优先级) 送你小心心记得关注我哦!! 进入...

  • Python高级第四天

    对象属性管理 Python下一切皆对象,每个对象都有多个属性(attribute),Python对属性有一套统一的...

  • CSS优先级及权重计算

    一、优先级分类通常可以将css 的优先级由高到低分为6组: 第一优先级:无条件有限的属性只需要在属性后面使用! i...

  • css权重(优先级)整理

    优先级: 浏览器通过优先级来判断哪一些属性值与元素最为相关,从而在该元素上应用这些属性值。优先级是基于不同种类的选...

网友评论

      本文标题:python对属性的搜索优先级

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