码迷,mamicode.com
首页 > 编程语言 > 详细

Python全栈开发——描述符

时间:2018-10-05 00:53:38      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:本质   错误   类型   描述符   elf   cep   class   一个   name   

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}

 

Python全栈开发——描述符

标签:本质   错误   类型   描述符   elf   cep   class   一个   name   

原文地址:https://www.cnblogs.com/lujiacheng-Python/p/9743827.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!