传送门

  1. https://docs.python.org/3/reference/datamodel.html#object.__getattr__
  2. https://docs.python.org/3/reference/datamodel.html#object.__getattribute__
  3. https://stackoverflow.com/questions/4295678/understanding-the-difference-between-getattr-and-getattribute
  4. https://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute

区别

  1. 当正常访问属性失败,即f.x,x不存在,会触发__getattr__
  2. 无论有无f.x,都会触发__getattibute__

Talk is cheap

__getattr__单个出现

class Foo:

    def __init__(self, x):
self.x = x def __getattr__(self, item):
#return self.__dict__[item]
return '__getattr__' f1 = Foo(1)
print(f1.x)
print(f1.xxxxxx) #访问不存在的属性访问,触发__getattr__

__getattribute__单个出现

class Foo:

    def __init__(self, x):
self.x = x def __getattribute__(self, item):
return '__getattribute__' f1 = Foo(1)
print(f1.x) # 访问存在的属性,也会直接执行__getattribute__
print(f1.xxx) # 访问不存在的属性,也会直接执行__getattribute__

__getattr__和__getattibute__同时存在

class Foo:

    def __init__(self, x):
self.x = x def __getattr__(self, item):
return '执行的是我,__getattr__'
# return self.__dict__[item] def __getattribute__(self, item):
print('不管属性是否存在,我都执行,__getattribute__')
raise AttributeError('__getattribute__的AttributeError') f1 = Foo(1)
# 当两者同时存在的时候,只会执行__getattribute__;如果在__getattribute__过程中抛出AttributeError,那么就执行__geattr__
print(f1.x)
# print(f1.xx)

18+ Warning

最好不要使用__getattribute__,不然有可能导致无限递归的可能。

Python - __getattr__和__getattribute__的区别的更多相关文章

  1. 浅谈Python 中 __getattr__与__getattribute__的区别

    __getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...

  2. python __getattr__和 __getattribute__

    __getattr__ 这个魔法函数会在类中查找不到属性时调用 class User: def __init__(self): self.info = 1 def __getattr__(self, ...

  3. __getattr__ 与 __getattribute__的区别

    原文博客地址 http://www.cnblogs.com/bettermanlu/archive/2011/06/22/2087642.html

  4. Python中__get__, __getattr__, __getattribute__的区别及延迟初始化

    本节知识点 1.__get__, __getattr__, __getattribute__的区别 2.__getattr__巧妙应用 3.延迟初始化(lazy property) 1.__get__ ...

  5. Python的__getattr__和__getattribute__

    __getattr____getattr__在当前主流的Python版本中都可用,重载__getattr__方法对类及其实例未定义的属性有效.也就属性是说,如果访问的属性存在,就不会调用__getat ...

  6. python魔法方法:__getattr__,__setattr__,__getattribute__

    python魔法方法:__getattr__,__setattr__,__getattribute__ 难得有时间看看书....静下心来好好的看了看Python..其实他真的没有自己最开始想的那么简单 ...

  7. python中的__getattr__、__getattribute__、__setattr__、__delattr__、__dir__

    __getattr__:     属性查找失败后,解释器会调用 __getattr__ 方法. class TmpTest: def __init__(self): self.tmp = 'tmp12 ...

  8. 一篇文章让你彻底明白__getattr__、__getattribute__、__getitem__的用法与执行原理

    __getattr__ 在Python中,当我们试图访问一个不存在的属性的时候,会报出一个AttributeError.但是如何才能避免这一点呢?于是__getattr__便闪亮登场了 当访问一个不存 ...

  9. 一些代码 II (ConfigParser、创建大文件的技巧、__getattr__和__getattribute__、docstring和装饰器、抽象方法)

    1. ConfigParser format.conf [DEFAULT] conn_str = %(dbn)s://%(user)s:%(pw)s@%(host)s:%(port)s/%(db)s ...

随机推荐

  1. Java连载83-单向链表、双向链表、collections常用方法

    一.单向链表 1.单向链表:每个元素都称为节点(Entry),每个节点都由两部分组成 2.单向链表的注意点: (1)单向链表每一个节点在内存中存储上在空间位置上是无规律的: (2)为什么单向链表的查询 ...

  2. js正则表达式验证端口范围(0-65535)

    javascript正则表达式验证IP地址的端口合法性 if (!(/^[1-9]\d*$/.test(port) && 1 <= 1 * port && 1 * ...

  3. IF EXISTS 两个条件连用

    当IF EXISTS要判断多个条件并存时,可以用AND连接,NOT EXISTS同理 IF EXISTS (SELECT 1 ) AND EXISTS (SELECT 2 ) BEGIN ...... ...

  4. HTML的页面结构

    HTML的页面结构 以下为命名的规范: header:标题头部区域的内容(用于页面或页面中的一块区域) footer:标记脚步区域的内容(用于整个页面或页面的一块区域) nav:导航类复杂内容 以上3 ...

  5. apache 二级域名设置

    1. 你要拥有一个有泛域名解析的顶级域名,例如:test.com 在dns服务上设置,域名服务商都提供此服务 www.test.com      指向服务器IPtest.com          指向 ...

  6. CentOS安装docker,及其基本操作

    CentOS安装docker,及其基本操作 一.安装docker Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上 1.uname -an 查看当前系统版本 2.y ...

  7. HTML学习(3)基础

    *开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag). *虽然有时候忘记写结束标签有的浏览器也能正常显示内容,但有时候会出现不可预料的结果或错误,所以 ...

  8. CSS-透明背景色兼容

    IE 不支持透明背景色 使用fileter div{ backgournd: #666; filter:alpha(opacity=50); -moz-opacity:0.5; opacity:0.5 ...

  9. 神经网路的层数,损失函数(loss)

    神经网络的复杂度:可用神经网络的层数和神经网络中待优化参数个数表示 神经网路的层数:一般不计入输入层,层数 = n 个隐藏层 + 1 个输出层 神经网路待优化的参数:神经网络中所有参数 w 的个数 + ...

  10. Bugku-CTF之本地包含( 60)

    Day36