python 中有2个获取对象属性的方法__getattribute__ 和__getattr__方法比较容易混淆,

接下来说明下这2个魔方方法的区别及用法:

__getattr__方法

class MyClass:

def __init__(self, x):

self.x = x

def __getattr__(self, item):

print('{}属性未找到!'.format(item))

return None

>>> obj = MyClass(1)

>>> obj.x

1

>>> obj.y

y属性未找到!

None

分析:首先我们定义了一个类并设置了一个实例属性x,重新定义__getattr__这个方法。在执行的时候,首先实例化obj这个对象,传递了一个1的实参,我们输出obj.x查看属性值,有找到并且为1;再次查找一个不存在的属性y,然后自动调用__getattr__这个方法,然后打印出没找到属性。(这里如果不重新定义__getattr__,会报AttributeError异常)。

class MyClass:

def __init__(self, x):

self.x = x

>>> obj = MyClass(1)

>>> obj.y

AttributeError: 'MyClass' object has no attribute 'y'

**调用__getattr__详细过程如下:**
obj.attr

  1. 首先会在对象的实例属性中寻找,找不到执行第二步
  2. 来到对象所在的类中查找类属性,如果还找不到执行第三步
  3. 来到对象的继承链上寻找,如果还找不到执行第四步
  4. 调用obj.__getattr__方法,如果用户没有定义或者还是找不到,抛出AttributeError异常,属性查找失败!

__getattribute__方法

当我们调用对象的属性时,首先会调用__getattribute__魔法方法。

class MyClass:

def __init__(self, x):

self.x = x

def __getattribute__(self, item):

print('正在获取属性{}'.format(item))

return super(MyClass, self).__getattribute__(item)

>>> obj = MyClass(2)

>>> obj.x

正在获取属性x

2

**注意上面例子标红处,需要返回父类的方法,若是返回其他很容易产生无限递归

例:

class MyClass:

def __init__(self, x):

self.x = x

def __getattribute__(self, item):

print('正在获取属性{}'.format(item))

return self.item

>>> obj = MyClass(2)

>>> obj.x

File "xxx", line 11, in __getattribute__ print('正在获取属性{}'.format(item)) RecursionError: maximum recursion depth exceeded while calling a Python object

调用此方法查找属性的过程与__getattr__方法一致。

====================================================================================

总的来说:

这2个方法作用都是相同的,都是查找对象的属性值,查询不到抛出异常。一般我们想自定义查找属性方法的时候,用__getattr__方法比较多,__getattribute__方法在调用对象属性的时候首先调用,而当__getattribute__查找失败,就会去调用__getattr__方法。

python 的魔方方法__getattribute__ 和__getattr__方法介绍相关推荐

  1. Python属性拦截器之__getattribute__与__getattr__

    在Python中自定义了很多内建属性,如__getattribute__(),即属性访问拦截器,它的作用是当我们访问实例对象的属性时,并不会立即返回属性的值,而是自动调用__getattribute_ ...

  2. python五十二:__setattr__,__delattr__,__getattr__方法

    class Foo:def __init__(self,x):self.x = xdef __getattr__(self, item):print("执行了getattr方法") ...

  3. python中setattr用法_python 中__setattr__, __getattr__,__getattribute__, __call__使用方法

    object._getattr_(self, name) 拦截点号运算.当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法.如果继承树可以找到该属性,则不调用此方法 实例in ...

  4. Python的__getattr__方法学习

    __getattr__函数的作用: 如果属性查找(attribute lookup)在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数: 如果没有定义这个函 ...

  5. day15、16:Python的魔方方法

    Python的魔方方法 基本的魔法方法 new(cls[, -]) 1. new 是在一个对象实例化的时候所调用的第一个方法 2. 它的第一个参数是这个类,其他的参数是用来直接传递给 init 方法 ...

  6. Python的__getattribute__ vs __getattr__的妙用

    这里的属性即包括属性变量,也包括属性方法.即类的变量和方法. 当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找 ...

  7. python 魔法方法常用_Python魔法方法指南

    有很多人说学习Python基础之后不知道干什么,不管你是从w3c还是从廖雪峰的教程学习的,这些教程都有一个特点:只能引你快速入门,但是有关于Python的很多基础内容这些教程中都没介绍,而这些你没学习 ...

  8. Python基础总结之常用内置方法总结

    文章目录 前言 1.str 1.1.内置方法: 1.2.常用的内置方法 1.3.String模块的一些方法 2.list 2.1.内置方法 2.2.常用内置方法 3.tupple 3.1.内置方法 3 ...

  9. Python(私有变量)类中的特殊方法

    2019独角兽企业重金招聘Python工程师标准>>> 类中的特殊方法 一般说来,特殊的方法都被用来模仿某个行为.例如,如果你想要为你的类使用x[key]这样的索引操作(就像列表和元 ...

最新文章

  1. mfc中picture control的用法_可能是最被误用的 HTTP 响应头之一 Cache-Control: must-revalidate
  2. Kotlin数组(Array)
  3. 商业实战第三场 电视直销好记星
  4. Visual Studio 2013开发 mini-filter driver step by step 获取文件读写内容(6)
  5. 没有理论支持的文章令人窒息
  6. ServletContextListener
  7. 算法竞赛入门经典 写题笔记(第五章 图论算法与模型2)
  8. Apache Jmeter 压测入门
  9. pyqt5-控件是否可用
  10. vs2015社区版有账号后仍然过期
  11. maya正交视图锁定与解锁
  12. Circulation:胎儿脑体积预测先天性心脏病患儿的神经发育
  13. matlab能输入铁心参数,变压器铁心剩磁预测研究
  14. Gradle配置多渠道打包
  15. maven使用TestNG
  16. 红帽Redhat—Linux软件管理
  17. c语言桶是什么意思,桶排序算法
  18. java2d游戏代码_Java 2d游戏中的“JUMP”
  19. 程序员的新年计划,你选择几个?
  20. ubuntu的分辨率突然变得很奇怪或者ubuntu 上qq无法打开

热门文章

  1. Cannot resolve dependency ‘snabbdom‘ or ‘snabbdom/init‘
  2. 旋转矩阵和变换矩阵的概念和区别
  3. 简单介绍函数式编程中的Functor(函子),Applicative(加强版函子),Monad(单子)
  4. 【答学员问】网站换ip后遇到的问题排查思路
  5. JAVA Set 交集,差集,并集
  6. 百度云搜索引擎森林战士_华为拟安装“俄版安卓”;百度回应内部贪腐;Android Studio 3.5 RC2 发布 | 极客头条...
  7. 【Bug】WindowsPowerShell\profile.ps1
  8. 【解决阿里云服务器提示挖矿程序风险2022】
  9. S7-1500系统内使用ET200S 1SI模块实现自由口通信
  10. JQuery——添加CSS样式