描述符的属性方法
__get__(self, instance, owner): 用于访问属性,返回属性的值
__set__(self, instance, value): 用于给属性赋值时,返回属性的值
__delete__(self, instance): 用于删除属性时,不返回任何内容
将某种特殊类型的类的实例指派给另一个类的属性(注意:是类属性,不是实例属性),而这种特殊类型的类是实现了__get__,__set__,__delete__这三个方法中的一个或多个,此时这个实例被称为描述符,而被指派属性的类叫做描述符类
描述符优点:保护属性不受修改、属性类型检查和自动更新某个依赖属性的值等。
>>>class Desc: #Desc是包含了三种方法中任意个的特殊类型的类
def __get__(self,instance,owner):
print('getting',self,instance,owner)
def __set__(self,instance,value):
print('setting',self,instance,value)
def __delete__(self,instance):
print('deleting',self,instance)
>>>class MyDesc(): #MyDesc这个类叫描述符类
>>>x = Desc() #类对象被指派给其他类作为属性,此时Desc()就是一个描述符
>>>mydesc = MyDesc()
>>>mydesc.x
getting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> <class '__main__.MyDesc'>
>>>mydesc.x = 1
setting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8> 1
>>>del mydesc.x
deleting <__main__.Desc object at 0x0000024A437D8F98> <__main__.MyDesc object at 0x0000024A43857EB8>
self: Desc object -> Desc的实例化对象,指的是x
instance: MyDesc -> MyDesc的实例化对象,指的是mydesc
owner: MyDesc -> 指的就是MyDesc类
>>>class MyDes:
def __init__(self,values,attr):
self.values = values
self.attr = attr
def __get__(self,instance,owner):
print('正在获取变量:',self.attr)
return self.values
def __set__(self,instance,value):
print('正在修改变量:',self.attr)
self.values = value
def __delete__(self,instance):
print('正在删除变量:',self.attr)
print('唔,这个变量没法删除')
>>>class Test:
x=MyDes(10,'x')
>>>test = Test()
>>>test.x
10
>>>test.x=8
正在修改变量: x
>>>test.x
8
>>>del test.x
正在删除变量: x
这个变量没法删除
>>>test.x
8