概念
描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()
中的一个,这也被称为描述符协议。
__get__():调用一个属性时,触发
__set__():为一个属性赋值时,触发
__delete__():采用del删除属性时,触发
用途
描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)
例:
包含这三种方法的新式类成为描述符,有这个方法产生的实例进行属性的调用/删除/赋值,并不会触发这三种方法
class Foo():
def __get__(self):
print('触发get')
def __set__(self):
print('触发set')
def __deletel__(self):
print('触发delete')
f1=Foo()
f1.name='alex'
f1.name
结果:
‘alex’
什么时候会触发:
首先有一个描述符,然后有一个被描述的类,定义成被描述类的类属性。即除描述符外的类的类属性,该类属性的值是描述符类的一个对象。
class Foo():
def __get__(self,inatance,owner):
print('触发get')
def __set__(self,inatance,owner):
print('触发set')
def __deletel__(self,inatance,owner):
print('触发delete')
class Bar():
name=Foo()
def __init__(self,name):
self.name=name
b1=Bar('alex')
b1.name
结果:
触发set
触发get
描述符分类
1、数据描述符:至少实现了__get__(),__set__()
2、非数据描述符:没有实现__set__()
注意事项
要严格遵循优先级,优先级由高到低分别为:
1、类属性
2、数据描述符
3、实例属性
4、非数据描述符
5、找不到的属性触发__getattr__()