zoukankan      html  css  js  c++  java
  • 第十七节:数据描述符

    数据描述符定义:
    一 描述符本身应该定义成新式类,被代理的类也应该是新式类
    二 必须把描述符定义成这个类的类属性,不能为定义到构造函数中
    三 要严格遵循该优先级,优先级由高到底分别是
    1.类属性
    2.数据描述符
    3.实例属性
    4.非数据描述符
    5.找不到的属性触发__getattr__()

    1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
    __get__():调用一个属性时,触发
    __set__():为一个属性赋值时,触发
    __delete__():采用del删除属性时,触发
    2 描述符是干什么的:描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这个类的类属性,不能定义到构造函数中)
    3 描述符分两种
    一 数据描述符:至少实现了__get__()和__set__()
    二 非数据描述符:没有实现__set__()

    class Typed:
        def __init__(self,key,expected_type):  
            self.key=key
            self.expected_type=expected_type
        def __get__(self, instance, owner):
            print('get方法')
            # print('instance参数【%s】' %instance)
            # print('owner参数【%s】' %owner)
            return instance.__dict__[self.key]
        def __set__(self, instance, value):
            print('set方法')
            # print('instance参数【%s】' % instance)
            # print('value参数【%s】' % value)
            # print('====>',self)
            if not isinstance(value,self.expected_type):
                # print('你传入的类型不是字符串,错误')
                # return
                raise TypeError('%s 传入的类型不是%s' %(self.key,self.expected_type))
            instance.__dict__[self.key]=value
        def __delete__(self, instance):
            print('delete方法')
            # print('instance参数【%s】' % instance)
            instance.__dict__.pop(self.key)
    
    class People:
        name=Typed('name',str) #t1.__set__()  self.__set__()
        age=Typed('age',int) #t1.__set__()  self.__set__()
        def __init__(self,name,age,salary):
            self.name=name
            self.age=age
            self.salary=salary
    
    # p1=People('alex','13',13.3)
    p1=People(213,13,13.3)
  • 相关阅读:
    归并排序
    快速排序
    希尔排序
    插入排序
    选择排序
    冒泡排序
    排序算法
    Win10 家庭版升级到专业版报错
    WPF 原生Style
    在线图片转换
  • 原文地址:https://www.cnblogs.com/sxdpython/p/12758104.html
Copyright © 2011-2022 走看看