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

不用描述符,不算懂 Python

时间:2022-12-25 16:11:48浏览次数:42  
标签:__ Python 代码 不算 描述符 油箱 属性

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

那么什么是描述符?

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

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

 

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

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

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

幸运的是,Python 有描述符。

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

 

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

 

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

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

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

 

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

 

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

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

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

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

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

最后的话

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

标签:__,Python,代码,不算,描述符,油箱,属性
From: https://www.cnblogs.com/10zhan/p/17004144.html

相关文章

  • Python学习笔记--SQL数据
    SQL本人受到Java的影响,数据库的话,就不按照教程走了,我就直接使用的是Navicat软件的数据库啦!SQL支持注释:两种单行注释(--和#),和一种多行注释(/**/)基础的使用语法:使......
  • python中socket使用UDP协议简单实现服务端与客户端通信
    UDP为不可靠传输,也就是发送方不关心对方是否收到消息,一般用于聊天软件。但现在的聊天软件虽然使用的是UDP协议,但已从代码层面上解决了丢失信息的问题。下面使用python代码......
  • Python中使用zip函数的七重境界
    1.引言Python中有一些内置函数,可以使我们的代码非常优雅。​​zip​​函数就是其中之一,但是zip函数的使用对于初学者来说不是很直观,有时容易出错。因此本文将从7个层次来......
  • memory描述符
    memory描述符告知gcc以下内容。不要将该段内嵌汇编指令与前面的指令重新排序。不要将变量缓存到寄存器。如果汇编指令修改了内存,但是gcc本身却察觉不到,因为在输出部分没......
  • 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
    准备工作开发环境Python版本:3.7.8相关模块:requests模块;tqdm模块;pyfreeproxy模块;pyechats模块;以及一些python自带的模块。效果预览开始界面 游戏规则wasd控制人物......
  • python之路55 cookie与session 操作 把模块变成字符串进行导入
    django中间件三个了解的方法1.process_view 路由匹配成功之后执行视图函数/类之前自动触发(顺序同process_request)2.process_exception 视图函数/类执行报错自动触发(......
  • python-数据库
    python使用内置SQLite3模块,支持SQLite3数据库的访问和相关的数据库操作。python3操作SQLite3数据库的基本流程如下:1)导入相关库或模块(SQLite3)2)使用connect()连接数据库并......
  • python中使用马尔可夫决策过程(MDP)动态编程来解决最短路径强化学习问题|附代码数据
    最近我们被客户要求撰写关于MDP的研究报告,包括一些图形和统计输出。在强化学习中,我们有兴趣确定一种最大化获取奖励的策略。假设环境是马尔可夫决策过程(MDP)的理想模型,我们......
  • 段力辉版本《OpenCV-Python 中文教程》学习
          此书极好,值得借鉴学习,并且开源开放。Python在实现过程中,体现出来了非常强的优势,特别是结合Numpy来进行矩阵计算,有很多简化方法。这里将学习过程代码进行增编......
  • pythonav资源分享登录流程:
    版一:importtimefromseleniumimportwebdriverfromaipimportAipOcrdefinitial():"""初始化连接"""APP_ID='16611607'API_KEY='wAIXfXOUS8ztLa4FrK3......