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__ 触发条件是实例化后才能触发

     

     

  • 相关阅读:
    PAT B1045 快速排序 (25 分)
    PAT B1042 字符统计 (20 分)
    PAT B1040 有几个PAT (25 分)
    PAT B1035 插入与归并 (25 分)
    PAT B1034 有理数四则运算 (20 分)
    PAT B1033 旧键盘打字 (20 分)
    HDU 1231 最大连续子序列
    HDU 1166 敌兵布阵
    HDU 1715 大菲波数
    HDU 1016 Prime Ring Problem
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9051951.html
Copyright © 2011-2022 走看看