前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中getattr、__get__、__getattr__和__getattribute__的区别

Python中getattr、__get__、__getattr__和__getattribute__的区别

作者头像
用户2936342
发布2018-08-27 15:29:51
6.4K0
发布2018-08-27 15:29:51
举报
文章被收录于专栏:nummynummy

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

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

  • getattr
  • __getattr__
  • __getattribute__
  • __get__

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

getattr

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

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

示例

代码语言:javascript
复制
>>> 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__方法。

示例

代码语言:javascript
复制
>>> 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异常。

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

代码语言:javascript
复制
>>> object.__getattribute__(self, name).

语法:object. __getattribute__(self, name)

示例

代码语言:javascript
复制
>>> 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__()方法是描述符方法之一。描述符用于将访问对象属性转变成调用描述符方法。

示例:

代码语言:javascript
复制
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
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • getattr
  • _ __getattr _ __
  • ____ getattribute __ __
  • ____ __ get ___ _
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com