Python 描述符

2024 年 8 月 29 日 | 阅读 3 分钟

简介: 本文讨论 Python 描述符。Python 描述符的创建是为了管理许多通过引用获取元素的类的属性。描述符使用了三个特殊的方法:`__getters__()`、`__setter__()` 和 `__delete__()`。当一个对象上定义了这些方法时,我们称之为描述符。

通常,Python 使用 getter 和 setter 等方法来更改属性值,而无需进行任何特殊处理。它们是一个简单的存储机制。有时,需要验证分配给某个值的值。描述符是属性、方法、静态方法和类方法背后的机制。

描述符是 Python 中独有的一个特性,它弥补了语言中许多隐藏的“魔法”。假设你认为 Python 描述符一直是一个复杂的话题,只有很少的实际用途。

如果是这样,本教程将是帮助你理解这一强大功能的绝佳工具。你将明白为什么 Python 描述符是一个如此令人兴奋的话题,以及它们有哪些用例。

什么是 Python 描述符?

描述符是一个实现了描述符协议方法的 Python 对象。这允许你创建在作为其他对象属性访问时表现出特殊行为的对象。描述符协议的正确定义是:

如果一个描述符只实现了 `.__get__()`,则它被称为非数据描述符。如果它们实现了 `.__set__()` 或 `.__delete__()`,则它们被称为数据描述符。请注意,这种区别不仅仅在于名称,还在于行为。

这是因为数据描述符在查找过程中具有优先权。

为什么使用 Python 描述符?

现在,我们知道了什么是 Python 描述符,以及 Python 本身如何使用它们来支持方法和属性等功能。我们还看到了在避免一些常见陷阱的同时创建 Python 描述符的方法。

到目前为止,一切都应该很清楚了,但你仍然可能想知道为什么应该使用它们。

根据我的经验,我知道许多优秀的 Python 开发人员从未在早期使用过这个选项,也不需要它。这很正常,因为很少有实际用例需要 Python 描述符。然而,这并不意味着 Python 描述符仅仅是高级用户的学术话题。仍然有一些令人惊叹的用例,值得花时间去掌握它们的使用方法。

Python 中的描述符协议: 在其他编程语言中,描述符被称为 setters 和 getters,并使用公共方法来获取和设置私有变量。Python 没有私有变量的概念,描述符协议可以被看作是 Python 实现类似功能的方式。

描述符是一种新的方式,可以在 Python 中实现类,而无需从特定对象继承任何东西。为了在 Python 中轻松实现描述符,你需要使用上面描述的至少一个方法。

请注意,以下示例返回访问了其属性的对象,而 owner 是将描述符分配为属性的类。Python 描述符具有 setter、getter 和 delete 方法的三种协议。

请注意以下重要事项:

  1. 描述符是通过 `__getattribute__()` 方法调用的。
  2. 覆盖 `__getattribute__()` 会阻止描述符的自动调用。
  3. `__getattribute__()` 和 `type.__getattribute__()` 调用 `__get__()` 的方式不同。
  4. 数据描述符始终覆盖实例字典。
  5. 实例字典可以覆盖非数据描述符。

示例: 现在我们给出一个 Python 描述符的示例。示例如下:

输出: 现在我们编译上述程序,然后得到以下结果:

Javatpoint

结论: 本文简要讨论了 Python 描述符。现在你已经了解了 Python 如何使用描述符来支持其一些特性,你将成为一名更具洞察力的开发者,了解为什么某些 Python 特性会以这种方式实现。


下一主题Python false