简介
一般用于代理另外一个类的属性
数据描述符:至少实现了__get__()或__set__()
非数据描述符:没有实现__set__()
优先级从高到低
优先级 | 内容 |
---|---|
1 | 类属性 |
2 | 数据描述符 |
3 | 实例属性 |
4 | 非数据描述符 |
5 | 找不到属性触发__getattr() |
__get__()
另外一个类调用一个本类属性时触发
class Describe: def __get__(self, instance, owner): print("您触发了__get__方法")class Circus: name = Describe()P = Circus()P.name
您触发了__get__方法
__set__()
另外一个类为本类属性赋值时触发
# -*- coding:utf8 -*-class Describe: def __set__(self, instance, value): print("您触发了__set__方法")class Circus: name = Describe()P = Circus()P.name = "test"
您触发了__set__方法
__delete__()
另外一个类删除本类属性时触发
# -*- coding:utf8 -*-class Describe: def __delete__(self, instance): print("您触发了__delete__方法")class Circus: name = Describe()P = Circus()del P.name
您触发了__delete__方法
实例
综合实例
# -*- coding:utf8 -*-class Typed: #定义描述符的类 def __get__(self, instance,owner): print('get方法') print('instance参数【%s】' %instance) print('owner参数【%s】' %owner) def __set__(self, instance, value): print('set方法') print('instance参数【%s】' %instance) print('calue参数【%s】' %value) def __delete__(self, instance): print('del方法') print('instance参数【%s】' %instance)class People: #定义的类 Name = Typed() #定义描述符实现类型检测 def __init__(self,name,age,result): #定义的类包含三种数据类型 self.Name = name #字符串 self.Age = age #正整数 self.Ralary = result #浮点数P = People('小明',18,'64.5') #触发 __set__ 方法P.Name #触发 __get__ 方法del P.Name #触发 __delete__方法
set方法instance参数【<__main__.People object at 0x0000020B23103BA8>】calue参数【小明】get方法instance参数【<__main__.People object at 0x0000020B23103BA8>】owner参数【】del方法instance参数【<__main__.People object at 0x0000020B23103BA8>】
描述符实现类型检测
# -*- coding:utf8 -*-class Typed: #定义类型判断类 def __init__(self,key,expected_type): #定义默认属性和期望类型 self.key = key self.expected_type = expected_type def __set__(self, instance, value): #类型判断 if not isinstance(value,self.expected_type): print('%s 传入的类型不是%s' %(self.key,self.expected_type)) #raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))class People: #定义类型汇总 name=Typed('name',str) #类和期望类型 age=Typed('age',int) salary=Typed('salary',float) def __init__(self,name,age,salary): #集成所有需求的类型 self.name=name self.age=age self.salary=salaryp = People('小明', 18, 60.5)p1 = People(15,18,60.5) #模拟名称错误p2 = People('小明','18',60.5) #模拟年纪错误p3 = People('小明',18,'60.5') #模拟成绩错误
name 传入的类型不是age 传入的类型不是 salary 传入的类型不是