6.描述符(__get__,__set__,__delete__)
定义:描述符本质就是一个新式类,在新式类中,至少实现了(__get__,__set__,__delete__)中的一个:这也被称为描述符协议
__get__:调用一个属性时,触发
__set__:为一个属性赋值时,触发
__delete__采用del删除属性时,触发
#特别注意优先级
优先级由高到低分别为:
1.类属性
2.数据描述符(定义描述符时有__get__和__set__这两种方法)
3.实例属性
4.非数据描述符
5.找不到的属性触发__getattr__()
#利用描述符进行类型限制(特别注意优先级) #万能数据监测 class Type: def __init__(self,x,excepet_type): #巧妙灵活 self.x=x self.excepet_type=excepet_type def __get__(self, instance, owner): # print(instance,owner) return instance.__dict__[self.x] def __set__(self, instance, value): # print(instance,value) if type(value)!=self.excepet_type: print(‘%s 传入的不是 %s ,错误!!!‘ %(self.x,self.excepet_type)) return instance.__dict__[self.x]=value def __delete__(self, instance): instance.__dict__.pop(self.x) class People: name=Type(‘name‘,str) #描述符代理 age=Type(‘age‘,int) def __init__(self,name,age,salary): self.name=name self.age=age self.salary=salary p=People(‘lujiacheng‘,‘3‘,5000) #age 传入的不是 <class ‘int‘> ,错误!!! print(p.__dict__) #{‘name‘: ‘lujiacheng‘, ‘salary‘: 5000} p.name=98 #name 传入的不是 <class ‘str‘> ,错误!!! print(p.__dict__) #jiacheng‘, ‘salary‘: 5000} p.name=‘98‘ print(p.__dict__) #{name‘: ‘98‘, ‘salary‘: 5000} del p.name print(p.__dict__) #{‘salary‘: 5000}
原文地址:https://www.cnblogs.com/lujiacheng-Python/p/9743827.html
时间: 2024-11-07 14:53:30