Python黑魔法Descriptor描述符的实例解析

Python黑魔法Descriptor描述符的实例解析

Python中,Descriptor描述符被用作属性的获取、设置和删除时自动触发的一系列协议。通过实现Descriptor协议,我们可以自定义属性访问的行为,从而实现更加灵活高效的属性操作。

Descriptor描述符协议

Python对于Descriptor描述符的协议规定了三个特殊方法:__get____set____delete__,分别用于在属性被获取、设置和删除时触发。

class Descriptor:
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass

其中,__get__(self, instance, owner)方法用于获取属性值,其中selfDescriptor实例本身,instance为属性所在的实例对象,owner为属性所在的类对象。如果该属性为类属性,则instanceNone

__set__(self, instance, value)方法用于设置属性值,其中value为要设置的属性值。

__delete__(self, instance)方法用于删除属性。

实例1:简单的计数器

我们通过实现一个简单的计数器来演示Descriptor的应用:

class Counter:
    def __init__(self):
        self.count = 0

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

    def __set__(self, instance, value):
        self.count = value

在这个实例中,我们实现了一个计数器Counter类,其中count为计数器的属性。在__get__方法中,我们返回了count属性当前的值。在__set__方法中,我们将count属性的值设置为传入的value参数。

接下来,我们创建一个实例并对其进行访问和修改操作:

class Test:
    count = Counter()

t = Test()
print(t.count) # 输出:0
t.count = 10
print(t.count) # 输出:10

我们发现,对于Test类的count属性,其实现为一个Descriptor描述符对象。在访问和设置属性时,实际上是触发了Counter类中__get____set__方法。通过这种方式,我们实现了一个可自动计数的属性,进而实现了更加灵活高效的属性操作。

实例2:限制属性值的范围

我们来实现一个Range描述符,用于限制属性值的取值范围。具体来说,我们可以通过传入一个范围的参数构造Range实例,在__set__方法中通过判断属性值是否在该范围内,进而对属性进行限制。

class Range:
    def __init__(self, min_value, max_value):
        self.min = min_value
        self.max = max_value

    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if value < self.min or value > self.max:
            raise ValueError(f'value should be in range [{self.min}, {self.max}]')
        instance.__dict__[self.name] = value

    def __set_name__(self, owner, name):
        self.name = name

在这个实例中,我们实现了一个Range描述符类,其中minmax为范围参数。在__get__方法中,我们直接返回了属性的值。在__set__方法中,我们对于传入的value参数进行了范围判断,并在不符合要求时抛出一个异常。

注意到上述实现中,我们通过__set_name__方法实现了对name属性的设置,从而在__set__方法中可以获取被操作的属性名称。这个方法是在Python 3.6版本中加入的,用于在类实例化时直接对描述符进行绑定。

接下来,我们创建一个Test类,并使用Range描述符限制其属性值的范围:

class Test:
    age = Range(0, 10)

t = Test()
t.age = 5
print(t.age) # 输出:5
t.age = 11 # 抛出异常:ValueError: value should be in range [0, 10]

我们发现,对于Test类的age属性,其实现为一个Range描述符对象。在设置属性时,实际上是触发了Range描述符中__set__方法,并进行了范围判断。通过这种方式,我们实现了一个可限制属性值范围的描述符,并且可以在属性设置时自动进行检查和抛出异常。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python黑魔法Descriptor描述符的实例解析 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 华为云Stack新版发布:构筑行业云底座,共创行业新价值

    摘要:在以“政企深度用云,释放数字生产力”为主题的华为云Stack战略暨新品发布会上,华为云提出深度用云三大关键举措,并发布华为云Stack 8.2版本,以智能进化推动创造行业新价值。 本文分享自华为云社区《【华为云Stack】【大架光临】华为云Stack新版发布 第1期 | 构筑行业云底座,共创行业新价值》,作者:大架光临。 随着数字化进程的不断深入,政企…

    2023年4月10日
    00
  • 华为云发布三大生态举措,携手伙伴及开发者共创新价值

    摘要:2022年是华为云与开发者、伙伴共同加速成长的一年。目前,华为云生态已聚合了全球超过350万开发者,相比去年同期增长1.3倍;汇聚41000多家合作伙伴,相比去年增长1.4倍;越来越多的开发者和伙伴选择加入华为云。 本文分享自华为云社区《华为云发布三大生态举措,携手伙伴及开发者共创新价值》,作者:华为云社区精选 。 华为全联接大会2022于11月7日-…

    云计算 2023年4月13日
    00
  • ASP.NET MVC下拉框中显示枚举项

    ASP.NET MVC下拉框中显示枚举项 在ASP.NET MVC中,我们可以使用下拉框来显示枚举项。这对于一些需要用户选择枚举值的应用程序非常有用。本文将提供一个完整攻略,包括如何在ASP.NET MVC中显示枚举项,并提供两个示例说明。 步骤1:定义枚举类型 首先,我们需要定义一个枚举类型。以下是一个示例说明,演示如何定义一个枚举类型: public e…

    云计算 2023年5月16日
    00
  • Numpy ndarray 多维数组对象的使用

    让我来详细讲解一下“Numpy ndarray 多维数组对象的使用”的完整攻略。 什么是Numpy ndarray多维数组对象? Numpy是Python中最常用的科学计算库。其核心对象是ndarray(即多维数组对象)。Numpy的ndarray对象是一个由相同类型的n维数组,数组的元素可以是任何数据类型,如整型、浮点型等等。ndarray对象的基本属性包…

    云计算 2023年5月18日
    00
  • 云计算和大数据时代网络技术揭秘(十七)VOQ机制

    VOQ机制   本章介绍的VOQ是一种新型的QoS机制,目的是为了解决著名的交换机HoL难题。 但VOQ强烈依赖于调度算法,例如,一个48口的交换机,每个端口都要维护48-1个FIFO缓存队列, 一共48×47=2256个缓存队列,这一方面对交换机的硬件条件提出了较高要求,也对如何设计良好 的转发包调度算法提出了巨大的挑战,目前仅有Cisco一家推出了商用产…

    云计算 2023年4月11日
    00
  • 说明及区分云计算的IaaS和PaaS以及SaaS三种服务方式

    云计算是一种基于互联网的计算方式,它提供了三种服务方式:IaaS、PaaS和SaaS。以下是一些攻略和示例,供您参考: 1. IaaS IaaS(基础设施即服务)是云计算的一种服务方式,它提供了基础设施的租用,包括计算、存储、网络等。IaaS服务提供商通常会提供虚拟机、存储空间、负载均衡、防火墙等基础设施服务,用户可以根据自己的需求选择相应的服务。 2. P…

    云计算 2023年5月16日
    00
  • 行业巨头的云计算冷数据存储应用和比较 2016-07-15

      如今,亚马逊网络服务,谷歌云平台,以及微软公司都提供了冷数据云存储服务的产品。每个公司都有一个不同的方法,那么他们的方法如何进行比较?   这是一个专门为数据访问不太频繁设计的的存储服务器。其作用是存储例如存储在Facebook网站中的老照片。该公司优化了低硬件成本,高容量和存储密度,以及低功耗。Facebook公司建立了独立的简化的数据中心,只是为了容…

    2023年4月10日
    00
  • “第八届中国云计算应用论坛”即将启幕,欢迎共商“SaaS时代”的未来

    眺望2018 新年伊始 万象更新 总会引发无限的遐想 而经历了2015年“中国企业级服务元年”,SaaS领域的创业成为了新赛道。 对于初创型的SaaS,“下半场”该何去何从?SaaS能否重新定义企业服务?SaaS企业如何在获客这条路上走得更远? 2018年1月21日,由中国新一代IT产业推进联盟指导,CIO时代学院与CIO时代研究会联合主办,CIO时代APP…

    云计算 2023年4月13日
    00
合作推广
合作推广
分享本页
返回顶部