• Python(代码篇)——1:描述符


    python3.6 代码篇:简单描述符

    描述符介绍:
    说的通俗一点,从表现形式来看,一个类如果实现了__get__,__set__,__del__魔法方法(三个方法不一定要全部都实现),并且该类的实例对象通常是另一个类的类属性,那么这个类就是一个描述符。__get__,__set__,__del__的具体声明如下:

      __get__(self, instance, owner) 
      __set__(self, instance, value)
      __delete__(self, instance)
    

    其中:
    __get__ 用于访问属性。它返回属性的值,或者在所请求的属性不存在的情况下出现 AttributeError 异常。
    __set__ 将在属性分配操作中调用。不会返回任何内容。
    __delete__ 控制删除操作。不会返回内容。

    注意:
    只实现__get__方法的对象是非数据描述符,意味着在初始化之后它们只能被读取。而同时实现__get__和__set__的对象是数据描述符,意味着这种属性是可读写的。

    下面为Python3.6 中property()【简单描述符】的原理

    class myproperty:
    	def __init__(self,fget=None,fset=None,fdel=None):
    		self.fget=fget
    		self.fset=fset
    		self.fdel=fdel
    	def __get__(self,instance,owner):
    		return self.fget(instance)
    	def __set__(self,instance,value):
    		self.fset(instance,value)
    	def __delete__(self,instance):
    		self.fdel(instance)
    
    

    新设置一个类,并用一个类属性来引用myproperty():

    class A:
    	def __init__(self,value=10):
    		self._x=value
    	def get_x(self):
    		return self._x
    	def set_x(self,value):
    		self._x=value
    	def del_x(self):
    		del self._x
    	x=myproperty(get_x,set_x,del_x)
    

    运行:

    >>> a=A()	#默认值为10
    >>> a._x
    10
    >>> a.x	#调用了__get__魔法方法
    10
    >>> a.x='xihua'	#调用了__set__魔法方法
    >>> a._x
    'xihua'
    >>> del a.x	#调用了__delete__魔法方法
    >>> a._x	#调用__delete__时已经删除a._x,所以出现AttributeError。
    Traceback (most recent call last):
      File "<pyshell#6>", line 1, in <module>
        a._x
    AttributeError: 'A' object has no attribute '_x'
    

    萌新试做,有什么不对的请各位大佬指出错误,感谢。

  • 相关阅读:
    drfViewSet (指定get关联的函数) 第一波
    drfViewSet之路由简写的方法
    defAPIView 响应 和 接收
    GenericAPIView
    Django接收前端传过来数组的方法
    Django数据迁移失败问题记录 managed = False不知道是不是不迁移的意思有空试试
    Minin混合类
    基于apiview接口实现 查、更新、删除
    drf序列化和反序列化。查询和提交 之Serializer
    python之jsonpath
  • 原文地址:https://www.cnblogs.com/free-soul/p/12864089.html
Copyright © 2020-2023  润新知