Python进阶-----描述符(__get__(),__set__(),__delete__())

Posted Meanwey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python进阶-----描述符(__get__(),__set__(),__delete__())相关的知识,希望对你有一定的参考价值。

一、描述符是什么
  描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
  __get__():调用一个属性时,触发
  __set__():为一个属性赋值时,触发
  __delete__():采用del删除属性时,触发

1 class Foo: #在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
2     def __get__(self, instance, owner):
3         print(__get__(),被执行了)
4     def __set__(self, instance, value):
5         print(__set__(),被执行了)
6     def __delete__(self, instance):
7         print(__delete__(),被执行了)

二、描述符的作用
  描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)

1 class Test:
2     x = Foo()
3     def __init__(self,x):
4         self.x = x
5 
6 t = Test(2)      #‘__set__(),被执行了‘
7 print(t.x)         #‘__get__(),被执行了‘   ‘None‘

三、描述符分为两种
  1、数据描述符:至少实现了__get__()和__set__()
  2、非数据描述符:没有实现__set__()

 1 #数据描述符
 2 class Foo:
 3     def __set__(self, instance, value):
 4         print(set)
 5     def __get__(self, instance, owner):
 6         print(get)
 7 
 8 #非数据描述符
 9 class Foo:
10     def __get__(self, instance, owner):
11         print(get)

四、注意事项:
  描述符本身应该定义成新式类,被代理的类也应该是新式类
  必须把描述符定义成这个类的类属性,不能为定义到构造函数中
  要严格遵循该优先级,优先级由高到底分别是
    1类属性
    2数据描述符
    3实例属性
    4非数据描述符
    5找不到的属性触发__getattr__()
















以上是关于Python进阶-----描述符(__get__(),__set__(),__delete__())的主要内容,如果未能解决你的问题,请参考以下文章

Python之路(第二十七篇) 面向对象进阶:内置方法描述符

了解 __get__ 和 __set__ 以及 Python 描述符

Python属性描述符

Python全栈开发——描述符

Python之路:描述符,类装饰器,元类

Python中的动态属性与描述符