Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中getattr、__get__、__getattr__和__getattribute__的区别

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

作者头像
用户2936342
发布于 2018-08-27 07:29:51
发布于 2018-08-27 07:29:51
7.2K01
代码可运行
举报
文章被收录于专栏:nummynummy
运行总次数:1
代码可运行

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

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

  • getattr
  • __getattr__
  • __getattribute__
  • __get__

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

getattr

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

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

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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
代码运行次数:0
运行
AI代码解释
复制
>>> 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
代码运行次数:0
运行
AI代码解释
复制
>>> object.__getattribute__(self, name).

语法:object. __getattribute__(self, name)

示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> 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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
object._getattr_(self, name) 拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__。当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的。如果在__getattr__(s
用户1214487
2018/01/24
1.3K0
__setattr__,setattr(),getattr__,getattr()及__getattribute__的区别
这里下面用网上比较热的代码进行测试和注释,因本人接触Python不足两星期,若有纰漏,请君不吝赐教;
全栈程序员站长
2022/11/15
4150
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的一个属性被调用) 
用户1214487
2018/07/31
1.7K0
python的__get__、__set
内容:     描述符引导         摘要         定义和介绍         描述符协议         调用描述符         样例         Properties         函数和方法         静态方法和类方法 摘要     定义并展示如何调用描述符,展示自定义描述符和几个内置的python描述符,包括函数、属性、静态方法和类方法,通过给出一个Python的示例应用来展示描述符是如何工作的.     熟练掌握描述符不仅让你拥有python使用的额外技巧,并且可以加深对Python内部如何工作的理解,提升对程序设计的能力,而且体会到python的设计优雅之处 定义和介绍     一般来说,描述符是带有“绑定行为”的对象属性,它的属性访问已经被描述符协议中的方法覆盖了.这些方法是__get__(),__set__(),和__delete__().     如果一个对象定义了这些方法中的任何一个,它就是一个描述符.     默认的属相访问是从对象的字典中 get, set, 或者 delete 属性,;例如a.x的查找顺序是:     a.x -> a.__dict__['x'] -> type(a).__dict__['x'] -> type(a)的基类(不包括元类),如果查找的值是对象定义的描述方法之一,python可能会调用描述符方法来重载默认行为,     发生在这个查找环节的哪里取决于定义了哪些描述符方法     注意,只有在新式类中描述符才会起作用(新式类继承type或者object class)     描述符是强有力的通用协议,属性、方法、静态方法、类方法和super()背后使用的就是这个机制,描述符简化了底层的c代码,并为Python编程提供了一组灵活的新工具 描述符协议
py3study
2020/01/19
1.4K0
魔法方法(2)
在学习面向对象程序设计时,我们通常会学到存取方法,它们是名称类似于getHeight和setHeight的方法,用于获取和设置属性(这些属性可能是私有的)。如果访问给定的时必须采取特定的措施,那么像这样封装状态变量(属性)很重要。例如,请看下面的Rectangle类:
不可言诉的深渊
2019/07/26
7530
Python - 描述器
我们可以使用 Python 自带的 property 装饰器 来控制属性的访问,下面这个例子通过 property 控制了 Person 的 age 属性的访问和修改
小歪
2019/05/14
9130
python-__getattr__ 和
python3完全使用了新式类,废弃了旧式类,getattribute作为新式类的一个特性有非常奇妙的作用。查看一些博客和文章后,发现想要彻底理解getattr和getattribute的区别,实际上需要理解python中属性的查找顺序、描述器(descriptor)、__get__、__set__、__dict__等知识。
py3study
2020/01/17
4310
Python进阶——什么是描述符?
在 Python 开发中,你可能听说过「描述符」这个概念,由于我们很少直接使用它,所以大部分开发人员并不了解它的原理。
_Kaito
2021/03/23
4140
python元编程
通过使用property可以将方法像属性一样获取值。使用setter对方法进行赋值操作
编程黑洞
2023/03/06
3610
Python中反射和描述器总结
在Python中,能够通过一个对象,找出type、class、attribute或者method的能力,成为反射。
py3study
2020/01/14
9850
Some question about
在 Python 中对于某些 object __dict__ 属性是只读的,比如对于 type object。然而,在 Python2.5-2.6 之前,还是有一些一般性方法可以获取和改变 __dict__ 属性的(without hacking with gc.get_referrents(), that is)。这会导致一些令人费解的错误。
py3study
2020/01/03
7220
python 中的特殊方法,纠正自己笨笨
  注: 在Python 3.x中没有新式类和老式类之分,它们都继承自'object' 类。因此可以不用显示地指定其基类。'object'基类中拥有的方法和属性可通用于所有的新式类。
py3study
2020/01/21
5740
五个与Python属性相关的魔术方法
今天要给大家介绍五个魔术方法,他们都与Python属性相关,涉及获取、删除和修改属性,我们一起来看看吧。
罗罗攀
2021/12/06
3410
3.python元类编程
1.1.propety动态属性 在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属性self.xxx和类方法。但有时我们需要的属性需要根据其他属性动态的计算,此时如果直接使用属性方法处理,会导致数据不同步。下面介绍@property方法来动态创建类属性。 from datetime import datetime,date class User: def __init__(self,name,birthday): self
zhang_derek
2018/05/30
5420
Python 中几种属性访问的区别
python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。本文阐述它们的区别和用法。
Python猫
2019/08/06
2.3K0
Python 中几种属性访问的区别
python笔记59-类里面的__getattribute__属性拦截器
写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的getattribute属性拦截器。 python的类默认都继承了object类,object提供了了很多原始的内建属性和方法。
上海-悠悠
2021/08/20
1.4K0
测试开发进阶(六)
面向对象编程的三大特征:封装,集成,多态 封装:将数据和方法放在一个类中 继承:python中的一个类可以继承于一个或多个类,被继承的叫父类(基类,base class),继承的类叫子类 多态:一类事物拥有多种形态,一个抽象类有多个子类,(多态的概念依赖于继承),不同的子类对象调用相同的方法,产生不同的执行结果,多态可以增加代码的灵活性 多态 # -*- coding:utf-8 -*- """ @Describe: 0816 @Author: zhongxin @Time: 2019-08-16 20:3
zx钟
2019/08/20
3960
【Python大神秘籍Top10】这些窍门99%的人都不知道
【新智元导读】Python神奇方法是指一些允许在自定义类中增加“神奇”功能的方法。而在Python官方文档中,有关这些方法的介绍或描述不仅内容分散,而且组织结构也相对松散。本文便对Python神奇方法做了系统的梳理。对于初学者亦或Python行家,都或多或少的会有些帮助。
新智元
2018/08/16
7300
【Python大神秘籍Top10】这些窍门99%的人都不知道
[PYTHON] 核心编程笔记(13.P
类与实例相互关联,类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息
py3study
2020/01/07
4120
Python面向对象编程Day 27部分
isinstance(obj,cls)检查obj是否是类cls的实例,反映族谱关系(不仅父类可以,父类的父类也可以) 
py3study
2020/01/19
3160
相关推荐
python 中__setattr__, __getattr__,__getattribute__, __call__使用方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档