美文网首页python进阶
Python中getattr、__get__、__getattr

Python中getattr、__get__、__getattr

作者: nummycode | 来源:发表于2016-06-21 11:35 被阅读562次

    原创博客,如需转载,请联系作者

    在使用Python的过程中可能遇到以下几个函数:

    • getattr
    • __getattr__
    • __getattribute__
    • __get__

    它们的用法是怎样的呢?它们之间又有什么区别呢?别急,请听我慢慢道来。

    getattr

    getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。

    • object 对象
    • name 属性名
    • default 当属性不存在时,返回的默认值

    示例

    >>> class Foo:
    ...     def __init__(self, x):
    ...         self.x = x
    ...
    >>> f = Foo(10)
    >>> getattr(f, 'x')
    10
    >>> f.x
    10
    >>> getattr(f, 'y', 'bar')
    'bar'
    

    _ __getattr _ __

    object. __getattr__(self, name)是一个对象方法,如果找不到对象的属性时会调用这个方法。

    这个方法应该返回属性值或者抛出AttributeError异常。

    注意,如果通过正常机制能找到对象属性的话,不会调用__getattr__方法。

    示例

    >>> class Frob:
    ...     def __init__(self, bamf):
    ...         self.bamf = bamf
    ...     def __getattr__(self, name):
    ...         return 'Frob does not have `{}` attribute.'.format(str(name))
    ...
    >>> f = Frob("bamf")
    >>> f.bar
    'Frob does not have `bar` attribute.'
    >>> f.bamf
    'bamf'
    

    ____ getattribute __ __

    当访问 某个对象的属性时,会无条件的调用这个方法。这个方法只适用于新式类。
    新式类就是集成自object或者type的类。

    如果类还同时定义了__getattr__()方法,则不会调用__getattr__()方法,除非在__getattribute__()方法中显示调用__getattr__()或者抛出了AttributeError

    该方法应该返回属性值或者抛出AttributeError异常。

    为了避免在方法中出现无限递归的情况,应该总是使用基类的方法来获取属性:

    >>> object.__getattribute__(self, name).
    

    语法:object. __getattribute__(self, name)

    示例

    >>> class Frob(object):
    ...     def __getattribute__(self, name):
    ...         print "getting `{}`".format(str(name))
    ...         return object.__getattribute__(self, name)
    ...
    >>> f = Frob()
    >>> f.bamf = 10
    >>> f.bamf
    getting `bamf`
    10
    

    ____ __ get ___ _

    __get__()方法是描述符方法之一。描述符用于将访问对象属性转变成调用描述符方法。

    示例:

    class Descriptor(object):
        def __get__(self, obj, objtype):
            print "get value=%s" % self.val 
            return self.val
    
        def __set__(self, obj, val):
            print "set value=%s" % val
            self.val = val
    
    class Stu(object):
        age = Descriptor()
    
    stu = Stu()
    stu.age = 12    # set value=12
    print stu.age   # get value=12
                    # 12
    

    相关文章

      网友评论

      本文标题:Python中getattr、__get__、__getattr

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