首页 > 编程语言 >不用描述符,不算懂 Python

不用描述符,不算懂 Python

时间:2023-01-15 11:07:50浏览次数:43  
标签:__ Python 代码 不算 描述符 油箱 属性


在日常的编码中,我们应该使用 Python 的描述符,来使代码更具有单一职责原则,也就是 SRP(Single Responsibility Principle)原则,如果你还没有用过描述符,那快来看看怎么用吧,不然就不好意思说自己懂Python。

那么什么是描述符?

描述符是控制对象属性访问的一种方式。它的好处是,让我们把类中设置和检索属性的任务抽离出来,并将这一任务交给另一个只有一个目的的类,帮助我们遵循 SRP 原则,也让代码更 Pythonic。

让我给你举个例子。你们大多数人都会知道 @property 装饰器,它基本上与描述符的作用相同。现在,让我们编写一个验证汽车油箱容量的类:

不用描述符,不算懂 Python_描述符

在上面的代码示例中,定义了一个有油箱的汽车类,我们希望限制油箱的容量不能小于 0 或高于 60 升。

@fuel_amount.setter 对赋值做检查,如果小于 0 或大于 60,就会引发 ValueError。为了获取油箱的容量,我们使用 @property,从私有属性 _fuel_amount 返回。

这看起来简单,好像也没什么问题,不过你细品一下,就会发现当属性越来越多的时候,你会看到满天的 property 和一堆业务逻辑代码的 setter,最后就是一个非常臃肿的 Car 类,看到你想吐,这与 Python 的设计哲学简单优雅相去甚远。

幸运的是,Python 有描述符。

现在来看看下面使用了描述符的代码,是不是清爽了很多:

不用描述符,不算懂 Python_描述符_02

这里的类 SixtyLitresCapacity 就是一个描述符类,作用就是限制大小为 0 到 60,具体代码如下:

不用描述符,不算懂 Python_Python_03

其实也很简单,一个类定义了一个 __get__ 和 __set__ 方法,就可以作为一个描述符类(还要注意参数列表)。

需要注意的是,只有为类属性设置描述符时才有效。如果将描述符用于实例属性,Python 会忽略它。

我们还可以做的更好,比如说将描述符类做得更加通用:

不用描述符,不算懂 Python_私有属性_04

这里的描述符类 IsBetween 代码如下:

不用描述符,不算懂 Python_Python_05

在 IsBetween 里,我们添加了一些新东西。

1、添加了__init__方法,以启用上下边界的初始化(min_value 和 max_value),这样,不仅可以有 60 升的油箱,还可以在油箱只剩下 5 升燃料时发出告警的功能。为了抛出不同的异常,将异常通过__init__方法的参数传进去。

2、添加了__set_name__(self, owner, name)方法。因为私有属性不一定是_fuel_amount,可以是你喜欢的任何属性。这种个方法打开了将属性名传递给给描述符类的大门。没有这个方法,描述符将无法从类中获得任何信息。

可以看到,IsBetween 这个描述符类更加通用,可以描述诸如电池电量、年龄属性、温度等属性。

你看,描述符类是不是非常有用?同时也帮助我们的代码遵循 SRP。

最后的话

本文分享了 Python 中描述符的使用,有没有学到新技能呢?

标签:__,Python,代码,不算,描述符,油箱,属性
From: https://blog.51cto.com/10zhancom/6008349

相关文章

  • 哪种编程语言更适合编写Selenium Web驱动程序脚本,Python还是Java?
    在本文中,我们将学习哪种编程语言更适合编写SeleniumWeb驱动程序脚本,Python或Java。从选项池中选择理想的编程语言可能很困难。Python,Java和Selenium都有自己的一套功能。越......
  • 我应该先学习哪种语言:HTML还是Python?
    在本文中,我们将学习首先学习哪种语言(HTML或Python)。PythonPython 是一种高级、面向对象、动态、解释和多用途编程语言,即多范式语言。其简单的语法和可读性使其非常适合用作......
  • Python是一种编程语言还是简单的脚本语言?
    在本文中,我们将了解Python编程还是简单的脚本语言,什么是脚本语言以及脚本和编程语言之间的区别。GuidoVanRossum开发了Python,这是最著名的编程语言之一。Python因其清......
  • 在Python中,什么是NumPy?如何使用?
    在本文中,我们将了解python中的NumPy以及如何在各种应用程序中使用它。什么是NumPy?NumPy是一个Python库,旨在有效地处理Python中的数组。它快速、简单易学且存储高效。它......
  • 如何在 Python 中从 t 分数中找到 p 值?
    数据是一种宝贵的资产,在当今社会中起着至关重要的作用,因为一切都强烈依赖于数据。如今,所有技术都是数据驱动的,并且会定期生成大量数据。数据是数据科学家学会利用的未处理信......
  • Python 编程范式的科普
    编程范式是计算机编程的基本风格或典范模式。如果说每个编程者都在创造虚拟世界,那么编程范式就是程序员置身其中采用的世界观和方法论。常见的编程范式包括:面向过程编程面向......
  • Python 中的函数参数
    在通常情况下,定义函数时,函数的参数个数是预先确定的。例如,编写计算两个数相加的函数add(a,b),代码如下:defadd(a,b):returna+bsum=add(1,2)在第1行,定义了函数......
  • Python 基础实战
    1.概述本节实现一个文件管理程序,该程序会使用到如下知识点:函数面向对象采用面向对象的程序设计方法对数据建模异常处理使用异常处理和文件相关的错误,例如文件不存......
  • Python 中的生成器实现原理
    1.如何生成一个巨大的序列1.1需求描述要求生成一个包含很多元素的序列,假设:存储1个整数需要4个字节现在要创建一个包含1G个整数的序列,从0到1*1024*1024*10......
  • Python 中的迭代器趣味实践
    1.遍历文本文件中的单词假设存在文本文件test.txt,内容如下:TheZenofPythonBeautifulisbetterthanuglySimpleisbetterthancomplex注意文件包含有空行,要求完成如......