资讯专栏INFORMATION COLUMN

python之属性描述符

alin / 2911人阅读

摘要:作为一个小白,每天都在不断地看东西,学知识,今天给大家介绍一个好东西属性描述符什么是属性描述符呢其实在一个类中实现中任意一个魔法函数就是一个属性描述符。接下来我们定义一个属性描述符当我们用类或者实例来调用该属性时,会返回函数的结果。

作为一个小白,每天都在不断地看东西,学知识,今天给大家介绍一个好东西——属性描述符
什么是属性描述符呢?
其实在一个类中实现set__、__get__、__delete中任意一个魔法函数就是一个属性描述符。
接下来我们定义一个属性描述符:

class IntegerField:
    def __get__(self, instance, owner):
        pass

    def __set__(self, instance, value):
        pass

    def __delete__(self, instance):
        pass


class User:
    high= IntField()

__get__:当我们用类或者实例来调用该属性时,会返回__get__函数的结果。
__set__:当我们用实例来设置属性值时,Python会调用该函数。对类没有限制作用。
__delete__:当我们用实例试图删除该属性时,Python会调用该函数。对类没有限制作用。
到底这个东西怎么用呢?接下来为大家修改上面的代码

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
        
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("请输入一个整数")
        self.value=value
        
    def __delete__(self, instance):
        pass


class User:
    high=IntegerField()
    
#验证代码
if __name__ == "__main__":
    user=User()
    user.high="175"    #报错,ValueError:请输入一个整数
    User.high=175    #正确执行,不报错

这样我们就能够运用属性描述符来给属性附上一定的逻辑了。
其实在属性描述符下还分为
1、数据描述符:实现了__set__、__get__

if __name__ == "__main__":
    user=User()
    user.high=175
    print(user.__dict__)    #high是不放入__dict__中的,优先查找数据描述符中的值
    user.__dict__["high"]="abc"    #这样赋值时可以的,并且可以放入__dict__中
    print(user.high)    #会报错,因为在调用__get__方法时并没有value属性

2、非数据:实现__get__不实现__set__

class NonField:
    def __init__(self, high=170):
        self.value = high

    def __get__(self, instance, owner):
        return self.value


class User:
    high = NonField()


if __name__ == "__main__":
    user = User()
    user.high = "175"    #会放入user.__dict__中
    print(user.__dict__)    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42777.html

相关文章

  • Python中的属性描述

    摘要:下面我们用描述符来实现中的动态属性和特性中提及的订单结算代码第四版使用描述符实现订单结算功能描述符基于协议实现,无需创建子类。特性是覆盖型描述符。非覆盖型描述符没有实现方法的描述符属于非覆盖型描述符。类中定义的方法是非覆盖型描述符。 导语:本文章记录了本人在学习Python基础之元编程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。 本文重点: 1、了解描述符...

    geekzhou 评论0 收藏0
  • [译] 属性访问、特性和描述 2

    摘要:不像其他属性,描述符在类级别上创建。当所有者类被定义时,每个描述符对象都是被绑定到一个不同的类级别属性的描述符类实例。这必须返回描述符的值。此外,描述符对有一个方便的响应和请求格式。 注:原书作者 Steven F. Lott,原书名为 Mastering Object-oriented Python __getattribute__()方法 __getattribute__()方法是...

    CloudwiseAPM 评论0 收藏0
  • Python中类的属性具有惰性求值的能力

    摘要:更多描述可见文档这种惰性求值的方法在很多模块中都会使用,比如中的使用上与例子一致,如表单中的讨论在大部分情况下,让属性具有惰性求值能力的全部意义就在于提升程序性能。当不需要这个属性时就能避免进行无意义的计算,同时又能阻止该属性重复进行计算。 起步 我们希望将一个只读的属性定义为 property 属性方法,只有在访问它时才进行计算,但是,又希望把计算出的值缓存起来,不要每次访问它时都重...

    NervosNetwork 评论0 收藏0
  • Bottle框架中的装饰器类和描述应用

    摘要:最近在阅读微型框架的源码,发现了中有一个既是装饰器类又是描述符的有趣实现。所以第三版的代码可以这样写第三版的代码没有使用装饰器,而是使用了描述符这个技巧。更大的问题来自如何将描述符与装饰器结合起来,因为是一个类而不是方法。 最近在阅读Python微型Web框架Bottle的源码,发现了Bottle中有一个既是装饰器类又是描述符的有趣实现。刚好这两个点是Python比较的难理解,又混合在...

    Panda 评论0 收藏0
  • python模块subprocess类与常量

    摘要:限于,可选的文件描述符序列,用于在父子进程间保持开放。如果设置了,表示派生的进程号子进程返回码,表示进程未终止。如果未捕获标准错误返回方法如果非,抛出异常异常模块的异常基类子进程执行超时。 常量 subprocess.DEVNULL:可传递给stdin, stdout, stderr参数的特殊值,意味着将使用特殊文件os.devnull重定向输入输出 subprocess.PIPE:可...

    Alan 评论0 收藏0

发表评论

0条评论

alin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<