`
luozhaoyu
  • 浏览: 343097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

python中__get__,__getattr__,__getattribute__的区别

阅读更多
__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同。
object.__getattr__(self, name)
当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常。

object.__getattribute__(self, name)
无条件被调用,通过实例访问属性。如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常)

object.__get__(self, instance, owner)
如果class定义了它,则这个class就可以称为descriptor。owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问,而是通过类访问的话,instance则为None。(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。)(所以下文的d是作为C2的一个属性被调用)

class C(object):
    a = 'abc'
    def __getattribute__(self, *args, **kwargs):
        print("__getattribute__() is called")
        return object.__getattribute__(self, *args, **kwargs)
#        return "haha"
    def __getattr__(self, name):
        print("__getattr__() is called ")
        return name + " from getattr"
    
    def __get__(self, instance, owner):
        print("__get__() is called", instance, owner)
        return self
    
    def foo(self, x):
        print(x)

class C2(object):
    d = C()
if __name__ == '__main__':
    c = C()
    c2 = C2()
    print(c.a)
    print(c.zzzzzzzz)
    c2.d
    print(c2.d.a)


输出结果是:
__getattribute__() is called
abc
__getattribute__() is called
__getattr__() is called 
zzzzzzzz from getattr
__get__() is called <__main__.C2 object at 0x16d2310> <class '__main__.C2'>
__get__() is called <__main__.C2 object at 0x16d2310> <class '__main__.C2'>
__getattribute__() is called
abc


小结:可以看出,每次通过实例访问属性,都会经过__getattribute__函数。而当属性不存在时,仍然需要访问__getattribute__,不过接着要访问__getattr__。这就好像是一个异常处理函数。
每次访问descriptor(即实现了__get__的类),都会先经过__get__函数。

需要注意的是,当使用类访问不存在的变量是,不会经过__getattr__函数。而descriptor不存在此问题,只是把instance标识为none而已。
分享到:
评论

相关推荐

    详解Python中 __get__和__getattr__和__getattribute__的区别

    __get__、__getattr__、__getattribute都是访问属性的方法,但作用不太相同,这里我们就来详解Python中 __get__和__getattr__和__getattribute__的区别:

    对比Python中__getattr__和 __getattribute__获取属性的用法

    主要介绍了对比Python中__getattr__和 __getattribute__获取属性的用法,注意二者间的区别,__getattr__只作用于不存在的属性,需要的朋友可以参考下

    浅谈 Python 魔法函数 __getattr__ 与 __getattribute__

    魔法函数 getattr 与 getattribute 简单说明 __getattr__ 与 __getattribute__ 魔法函数的使用 目录魔法函数 __getattr__ 与 __getattribute____getattr__魔法函数作用__getattribute__魔法函数总结 书上说,天下...

    Python __setattr__、 __getattr__、 __delattr__、__call__用法示例

    主要介绍了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,本文分别对这几个魔法方法做了讲解,需要的朋友可以参考下

    Python __getattr__与__setattr__使用方法

    class Book(object): def __setattr__(self, name, value): if name == ‘value’: object.__setattr__(self, name, value – 100) else: object.__setattr__(self, name, value) def __getattr__(self, name)...

    浅谈python中的__init__、__new__和__call__方法

    主要给大家介绍了关于python中__init__、__new__和__call__方法的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友可以参考学习,下面来跟着小编一起看看吧。

    浅谈python中的getattr函数 hasattr函数

    下面小编就为大家带来一篇浅谈python中的getattr函数 hasattr函数。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Python的__builtin__模块中的一些要点知识

    2.getattr函数:可以给一个默认值,以免触发错误。 writte=getattr(obj,'write',sys.stdout.write) 3.type函数:即可以得到一个对象的类型,也可以直接由它创建一个新类型: &gt;&gt;&gt; Point=type('Point',(object,),{...

    Python中几种属性访问的区别与用法详解

    python的提供一系列和属性访问有关的特殊方法: __get__ , __getattr__ , __getattribute__ , __getitem__ 。本文阐述它们的区别和用法。 属性的访问机制 一般情况下,属性访问的默认行为是从对象的字典中获取,并...

    Python类中方法getitem和getattr详解

    主要介绍了Python类中方法getitem和getattr详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Python Request类源码实现方法及原理解析

    通过APIView进入找到Request的源码 可以看见一堆属性和方法,其中request.data其实是一个方法,被包装成一个属性 继续看__getattr__和query_params方法: ... 您可能感兴趣的文章:Python reques

    Python面向对象魔法方法和单例模块代码实例

    魔法方法 ​ 凡是在类内部定义,以“__开头__... __getattribute__:会在对象.属性时触发,不管有没有该属性都会触发; __setattr__: 会在 “对象.属性 = 属性值” 时触发。即:设置(添加/修改)属性会触发它的执行;

    Python黑魔法之描述符

    Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被广泛应用于Python语言的内核...下面这个例子中我们创建了一个RevealAcess类,并且实现了__get__方法,现在这个类可以被称为一个描述符类。接下来

    Python黑魔法Descriptor描述符的实例解析

    数据描述符是指实现了__get__,__set__,__del__方法的类属性(由于Python中,一切皆是对象,所以你不妨把所有的属性也看成是对象) PS:个人觉得这里最好把数据描述符等效于定义了__get__,__set__,__del__三个方法的接口...

    全面了解Python的getattr(),setattr(),delattr(),hasattr()

    下面小编就为大家带来一篇全面了解Python的getattr(),setattr(),delattr(),hasattr()。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    python中getattr函数使用方法 getattr实现工厂模式

    Get a named attribute from an object; getattr(x, ‘y’) is equivalent to x.y. When a default argument is given, it is returned when the attribute doesn’t exist; without it, an exception is raised in ...

    python中的内置函数getattr()介绍及示例

    在python的官方文档中:getattr()的解释如下: getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object's...

Global site tag (gtag.js) - Google Analytics