• python 自定义属性访问,描述器


    一 、 自定义属性访问
    1.__getattr__
    作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发。

    2.__getattribute__
    作用:访问属性的时候,第一时间触发该方法去找属性。如果没找到触发AttrError

    总结:当我们去访问一个不存在的属性时,首先会触发__getattribute__,然后才会触发__getattr__
    如果属性存在,就返回这个属性值,如果没有就报 AttrError

    3. __setattr__(self,key,value)
    作用:这个属性在给对象设置属性的时候触发

    例子:
    def __setattr__(self,key,value):
      if key == "age" :
      super().__setattr__(key,18)
      else:
      print("设置属性的时候会触发")
      super().__setattr__(key,value)

    4. __delattr__(self,item):
      print("删除的时候被触发")
      super().__delattr__(item)
      item : 被删除的类属性名
    作用:如果我们不想一个属性被删除,就重写__delattr__方法,如果调用父类的方法就会被删除


    二、描述器

    描述器是一个具有"绑定行为"的对象属性,该对象的属性访问通过描述器协议覆盖:__get__()
    __set__()和__delete__().如果一个对象定义这些方法中的任何一个,它被称为一个描述器。

    1.object.__get__(self,instance,owner)
    获取主类的属性或者该类的一个实例的属性。owner始终是属主,instance是属性访问的实例
    当属性通过owner访问时则为None。这个方法该返回的属性值,或者引发一个AttributeError
    异常

    2.object.__set__(self,instance,value)
    设置属主类的实例instance的属性为一个新值value

    3.object.__delete__(self,instance)
    删除属主类的实例insta的属性
    例子:

     1 class Filed(object):
     2   def __get__(self,instance,owner)
     3       print("访问属性的时候被触发")
     4       return self.value
     5 
     6 def object.__set__(self,instance,value)
     7   print("set方法被触发")
     8   self.value = value
     9 
    10 def object.__delete__(self,instance)
    11   print("删除属性的时候被触发")
    12   self.value = None
    13 
    14 class Model(object):
    15 name = '熊猫'
    16 attr = Filed() # 描述器对象:会覆盖类属性的相关操作
  • 相关阅读:
    12.2 ROS NavFn全局规划源码解读_2
    12.1 ROS NavFn全局规划源码_1
    12 ROS Movebase主体源码解读
    11 ROS 动态参数调节
    10. ROS costmap代价地图
    无人驾驶汽车1: 基于Frenet优化轨迹的无人车动作规划方法
    VC下加载JPG/GIF/PNG图片的两种方法
    vc++加载透明png图片方法-GDI+和CImage两种
    供CImage类显示的半透明PNG文件处理方法
    使用MFC CImage类绘制PNG图片时遇到的问题
  • 原文地址:https://www.cnblogs.com/addicated/p/13167353.html
Copyright © 2020-2023  润新知