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

     

     

  • 相关阅读:
    我们的回忆

    出差
    恍惚
    七夕
    K8S命令(一)——Node相关
    K8S命令(二)——查询相关
    [转载]为什么你应该(从现在开始就)写博客
    替代JDK日期的开源项目:jodatime
    使用getElementById获取xml中的指定元素
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9051951.html
Copyright © 2011-2022 走看看