美文网首页
Python属性描述符笔记

Python属性描述符笔记

作者: 拖延症旳理想主义者 | 来源:发表于2020-01-08 11:02 被阅读0次
    # -*- coding: utf-8 -*- 
    
    __author__ = "Mr-Li"
    __date__ = "2020/1/7 10:25"
    
    
    class IntField:
    
        """
        1、实现了__get__,__set__,__delete__之一,这个类就称之为属性描述符
        属性描述符是用来统一控制属性的生成过程
        """
        def __init__(self, max_num=9, min_num=0):
            self.max_num = max_num
            self.min_num = min_num
    
        def __get__(self, instance, owner):
            return self.value
    
        def __set__(self, instance, value):
            if isinstance(value, int):
                if self.max_num >= value >= self.min_num:
                    self.value = value
                else:
                    raise ValueError("最大值:{},最小值:{}".format(self.max_num, self.min_num))
            else:
                raise ValueError("must int value")
    
        def __delete__(self, instance):
            self.value = self.min_num
    
    
    class NotDataField:
    
        """ 2、只实现一个 __get__ 被称之为非数据属性描述符 """
    
        def __get__(self, instance, owner):
            return 0
    
    
    class User:
        age = IntField(max_num=9, min_num=1)
    
    
    if __name__ == '__main__':
        """ 
        3、类的实例的__dict__,只保存实例属性
        类的__dict__,则包含类的所有属性
        """
        user = User()
        # 属性描述符的属性赋值,只是调用__set__方法
        user.age = 8
        print(user.__dict__, User.__dict__)
        # 属性描述符的属性取值,只是调用__get__方法
        print(user.age)
    
        """
        属性的查找顺序:
        1、如果是属性描述符,则会首先去调用属性描述符的__get__方法
        2、不是属性描述符,则会到obj.__dict__里面去找
        3、如果obj.__dict__没有,他又是非数据属性描述符,则调用非属性描述符的__get__方法
        4、如果不是非属性描述符,则去class和他的基类的__dict__里面去找
        5、都没有,执行__getattr__方法
        6、再没有,抛出属性查找不到的异常
        """
    
    
    
    

    相关文章

      网友评论

          本文标题:Python属性描述符笔记

          本文链接:https://www.haomeiwen.com/subject/xagjactx.html