当前位置: 首页 > news >正文

__getattribute__

__getattribute__

文章目录

  • `__getattribute__`
    • `__getattribute__`介绍
      • 1.先看看:`__getattr__`
      • 2.`__getattribute__`
      • 3.`__getattr__` 和 `__getattribute__`同时存在
      • 4.总结

__getattribute__介绍

1.先看看:__getattr__

  • 点 . 属性 没找到触发

    class Foo:
        def __init__(self, x):
            self.x = x
    
        def __getattr__(self, item):
            print("没找到,所以回执行我")
    
    
    f1 = Foo(10)
    print(f1.x)  # 10
    f1.xxxxxx  # 不存在的属性访问,触发__getattr__
    

2.__getattribute__

  • 点 . 属性 无论找没找到都触发

    class Foo:
        def __init__(self, x):
            self.x = x
    
        def __getattribute__(self, item):
            print("不管是否存在,我都会执行")
    
    
    f1 = Foo(100)
    f1.x  # 不管是否存在,我都会执行
    f1.xxxx  # 不管是否存在,我都会执行
    

3.__getattr____getattribute__同时存在

#两者同时存在
class Bar:
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        print("没找到,触发了我")

    def __getattribute__(self, item):
        print(f"无论找没找到,都触发了我--》{item}")


ll = Bar("淘小欣")
ll.name  # 无论找没找到,都触发了我--》name
ll.age  # 无论找没找到,都触发了我--》age


#s设置异常
class Bar:
    def __init__(self, name):
        self.name = name

    def __getattr__(self, item):
        print("没找到,触发了我")

    def __getattribute__(self, item):
        print(f"无论找没找到,都触发了我==>{item}")
        raise AttributeError("让小弟接管")  # 设置异常,直接交给__getattr__


bb = Bar("淘小欣")

bb.name
'''输出内容
无论找没找到,都触发了我==>name
没找到,触发了我
'''

bb.age

'''输出内容
无论找没找到,都触发了我==>age
没找到,触发了我
'''
  • [对象] . [属性] 的调用顺序 : 先执行 __getattribute__—>去类的名称空间找—>__getattr__(本质是去对象自己的名称空间找)
  • [对象] . [属性] 的查找顺序 : 对象自己**—>—>父类—>**父类

4.总结

  • __getattribute__方法优先级比__getattr__
  • 没有重写__getattribute__的情况下, 默认使用的是父类的__getattribute__方法
  • 只有在使用默认__getattribute__方法中找不到对应的属性时,才会调用__getattr__
  • 如果是对不存在的属性做处理,尽量把逻辑写在__getattr__方法中
  • 如果非得重写__getattribute__方法,需要注意两点:
    • 第一是避免.操作带来的死循环
    • 第二是不要遗忘父类的__getattribute__方法在子类中起的作用

相关文章:

  • item系列 __getitem__, __setitem__,__delitem__
  • __format__
  • 析构方法 __del__
  • 链式调用知识
  • 上下文管理协议 __enter__ 和 __exit__
  • `__eq__`
  • ` __hash__`
  • ` __len__`
  • 实现迭代器`__iter__ 和 __next__`
  • ` __all__`
  • `__slots__ 和 __dict__`
  • `__module__ 和 __class__`
  • 注释文档 `__doc__`
  • `__call__`
  • `__init__ 和 __new__(重点)`
  • ComponentOne 2017 V2版本正式发布
  • JAVA之继承和多态
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • React Native移动开发实战-3-实现页面间的数据传递
  • Vue小说阅读器(仿追书神器)
  • 爱情 北京女病人
  • 经典排序算法及其 Java 实现
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​什么是bug?bug的源头在哪里?
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (转)memcache、redis缓存
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .Net 4.0并行库实用性演练
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .Net Remoting(分离服务程序实现) - Part.3
  • .NET构架之我见
  • .NET面试题(二)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • @基于大模型的旅游路线推荐方案
  • [2669]2-2 Time类的定义
  • [BeginCTF]真龙之力
  • [BZOJ] 3262: 陌上花开
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++]打开新世界的大门之C++入门
  • [C语言]编译和链接
  • [docker] Docker的数据卷、数据卷容器,容器互联
  • [ERROR] 不再支持目标选项 5。请使用 7 或更高版本
  • [Flutter]打包IPA
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句