zoukankan      html  css  js  c++  java
  • __getattr__ __delattr__ __setattr__ __getattribute__使用(重写python提供的错误信息)

    自己定义了这些attr 查找删除设置就会触发自己定义的逻辑,如果不重新,pyton会提供自己报错信息class Room:
        def __init__(self,name):
    self.name = name

    def big_room(self):
    print('bigroot')

    def __getattr__(self, item):
    print('调用一个不存的对象属性时候,执行',item)

    def __delattr__(self, item):
    print('删除一个属性时候,执行',item)

    def __setattr__(self, key, value):
    print('设置一个属性操作的时候,执行')
    self.__dict__[key] = value
    print(key,value)
    #self.key = value #这些写会报错递归 RecursionError: maximum recursion depth exceeded 因为这个也是在设置一个属性,当设置这个属性的时候,也会触发__setattr__,这样就会一直循环,最后报错,所有使用self.__dict__[key] = value操作
     

    def __getattribute__(self, item):
            print('只要运行,我就执行',item)   #只要执行调用,我就执行

    R = Room('回电话') #设置一个属性操作的时候,执行__setattr__; __init__中的self.name 传递给key name 传递给value
    R.ddddddd #调用这个对象属性不存在,就执行__getattr__ 属性,不要加括号 ddddddd 这个参数会传递给item
    del R.yiii #删除的时候会触发__delattr__ 不管删除的这个属性是否存在 都触发 yiii 这个参数会传递给item
    print(R.__dict__)
    Room.txt = 2 #无法触发__setattr__
    执行结果:

      设置一个属性操作的时候,执行
      name 回电话
      调用一个不存的对象属性时候,执行 ddddddd
      删除一个属性时候,执行 yiii
      {'name': '回电话'}

    注意: __getattr__  __delattr__  __setattr__ 触发条件是实例化后才能触发

     

     

  • 相关阅读:
    Trie
    [转]Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
    [Bzoj2242]常见数值算法
    JavaScript百炼成仙(记录笔记)
    tcpreplay重放报文,tcpdump能抓到包,应用程序收不到包
    用jquery tools来实现选项卡
    ExtNet第二篇
    线性表最简单的表示
    c语言中线性表基本操作方法
    ExtNet第一篇
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9051951.html
Copyright © 2011-2022 走看看