zoukankan      html  css  js  c++  java
  • Python中的动态属性与描述符

    动态属性与属性描述符

    属性描述符是什么?

      在解释属性查找顺序之前我们需要了解Python中的属性描述符,属性描述符作为其他类对象的属性而存在,实现了特殊方法中的get、set、delete中的一种即可称作属性描述符。

    其中只实现了__get__()的称作非数据描述符,实现了__get__()和__set__()方法的称作数据描述符。

    • Data.py
    class Data():
        def __get__(self, instance, owner):
            pass
        
        def __set__(self, instance, value):
            pass
        
        def __delete__(self, instance):
            pass
    
    
    • NoData.py
    class NoneData():
        def __get__(self, instance, owner):
            pass
    

    动态属性

      在实际项目的开发中我们有时候需要去将自己的逻辑(方法)变成属性来调用,也就是我们常说的@property动态属性。

    • PropertyTest.py
    import numbers
    class User:
        def __init__(self):
            pass
        @property
        def age (self):
            return self.__userage
        @age.setter
        def age(self,value):
            if isinstance(value,numbers.Integral):
                self.__userage = value
            else:
                raise ValueError
    if __name__ == '__main__':
        user = User()
        user.age = 30
        print(user.age)
    
    
    • 对用户信息的赋值中,我们需要对值进行判断是否合法,直接在初始化特殊方法中进行判断是无法实现的。因此需要引入动态属性,将判断和赋值在age方法中进行,同时添加@property装饰器,将方法转换为供我们调用的属性。当然我上述的代码合法性判断只写了整数判断,具体的读者可以自行实现。

    属性描述符

      读到这,肯定很多人者都会有一个疑问,那属性描述符还有什么用呢?我们在设计User类的时候,肯定不只有age这一个属性,如果再加上其他信息属性,那么就会出现大量的@property修饰的方法在同一个类,这是不符合设计原则的,代码的分离性和可读性大大降低。这时候属性描述符就能起到很大的帮助了。

    • Desc.py
    class AgeAttr:
        def __get__(self, instance, owner):
            return self.__userage
    
        def __set__(self, instance, value):
            if isinstance(value,numbers.Integral):
                self.__userage = value
            else:
                raise ValueError
    
        def __delete__(self, instance):
            pass
    
    class User:
        age = AgeAttr()
        def __init__(self):
            pass
    
    
    import numbers
    
    if __name__ == '__main__':
        user = User()
        user.age =25
        print(user.age)
    
    
    • 将代码使用属性描述符重新构造后,User类中的代码大大减少,我们能更好地提高代码的分离性

    关于属性的查找顺序请看这>属性查找顺序

  • 相关阅读:
    Requests 库
    Mac下终端配置(item2 + oh-my-zsh + solarized配色方案)
    中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
    scp
    请求https前缀的网站验证SSL证书的解决方案之一
    jupyter notebook更换主题 步骤详解。
    jupyter nbextensions的 安装
    装饰器的学习 高级版-- 语法糖参数
    装饰器的学习 初级版-- 高阶函数,嵌套函数,闭包
    Python数据可视化的完整版操作指南(建议收藏)
  • 原文地址:https://www.cnblogs.com/7levy/p/11331280.html
Copyright © 2011-2022 走看看