描述符(get,set,delete__)
1、描述符本质就是一个新式类,在这个新式类中,至少实现了 get()、set()、delete() 中的一个,这也被称为描述符协议
get():调用一个属性时触发
set():为一个属性赋值时触发
delete():采用del删除属性时触发
class Foo: #Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
def __get__(self, instance, owner):
pass
def __set__(self, instance, value):
pass
def __delete__(self, instance):
pass
2、描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)
class Foo: #描述符Foo
def __get__(self, instance, owner):
print('get方法')
def __set__(self, instance, value):
print('set方法')
instance.__dict__['name']=value #instance 代表实例,该语句操作实例字典
def __delete__(self, instance):
print('delete方法')
class People:
# name 被Foo 代理,所以在对name进行操作实际是操作Foo的三种方法
name = Foo()
def __init__(self,name): #name被Foo类代理
self.name = name
p1 = People('hah')
print(p1.name)
p1.name = 'bbb'
del p1.name
3、描述符分两种:
一 数据描述符:至少实现了 get() 和 set()
class Foo:
def __get__(self, instance, owner):
print('get方法')
def __set__(self, instance, value):
print('set方法')
二 非数据描述符:没有实现 set()
class Foo:
def __get__(self, instance, owner):
print('get方法')
注意事项:
1、描述符本身应该定义为新式类,被代理的类也应该是新式类
2、必须把描述符定义成这个类的类属性,不能定义到构造函数中去
3、要严格遵循该优先级,优先级由高到低分别是:
- 类属性
- 数据描述符
- 实例属性
- 非数据描述符
- 找不到的属性触发 getattr()
class Foo: #Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
def __get__(self, instance, owner):
print('--->get方法')
def __set__(self, instance, value):
print('--->set方法')
#instance.__dict__['name']=value #instance 代表实例,该语句操作实例字典
def __delete__(self, instance):
print('--->delete方法')
class People:
name = Foo()
#print(People.name)
#类属性 > 数据描述符
# People.name = 1
# print(People.__dict__)
# print(People.name)
#数据描述符 > 实例属性
print(People.__dict__)
b1 = People()
print(b1.name)
b1.name = 1
del b1.name