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之路(第二十七篇) 面向对象进阶:内置方法描述符