• Python全栈开发——描述符


    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}
  • 相关阅读:
    组合数据类型练习,英文词频统计实例
    条件、循环、函数定义等练习
    大数据应用实例
    实验二-模拟在CPU中的优先级调度
    实验二——模拟在CPU中的进程调度(改稿)
    实验二——模拟在CPU中的进程调度(初稿)
    回答前文问题
    13.14.15.16.17&《一个程序猿的生命周期》读后感
    10,11,12读书有感
    读书三章8,9,10
  • 原文地址:https://www.cnblogs.com/lujiacheng-Python/p/9743827.html
Copyright © 2020-2023  润新知