Python:关于使用单一分派函数的官方指南

2024-10-05 14:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚从functools学习了@singledispatch操作符。我的第一个想法是,我现在将在所有地方使用这个,因为我经常编写这样的函数。但是,我已经使用Python好几年了,以前从未遇到过这种情况,这很可怕

为什么其他人不在任何地方使用这个?是否有我不知何故遗漏的昂贵的权衡

关于何时使用或不使用@singledispatch,是否有某种官方指导


Tags: 函数官方地方情况指导functoolssingledispatch遗漏
1条回答
网友
1楼 · 发布于 2024-10-05 14:21:25

singledispatch decorator只是实现多态性的几种方法之一,虽然它通过多方法在Clojure等语言中广泛使用,但它在Python领域并不常见

在面向OOP的语言中,您通常会看到多态性应用于类级别,其中对象定义了一个方法,它的派生子类调整了它的行为。这又是singledispatch的一种形式,它隐式地存在于对象的类类型中,即根据self参数而不是实际的方法输入参数来调度实现

另一种应用多态性的流行方法是我称之为“duck多态性”。为了澄清这一点,一个例子是列表和字典的pop方法。在本例中,两个对象都在抽象行为级别实现了相同的方法,这些方法将内容删除到集合中,它们共享核心思想,但实现不同,它们之间没有类层次结构。在某种意义上,它们类似于接口,但在不太严格的意义上,你像鸭子一样嘎嘎叫,这样我就可以像鸭子一样对待你,而不会破坏代码

总而言之,实现相同行为的其他方法似乎被更多地使用,最终这取决于开发人员喜欢如何构造他们的代码

回到其他问题,我(天真地)不会说使用decorator会带来巨大的性能损失,尽管与直接调用一个func相比,肯定会涉及更多的查找和函数调用

关于官方建议,值得一读。在这里,您可以找到为什么将其添加到语言中的历史概述


编辑:宫城所作的一些重要更正

  1. 字典没有append方法
  2. 类似文件的对象实际上是基本对象的子类
  3. Print不会对参数类型进行分派,而是调用参数的strrepr方法。事实上,PEP中的singledispatch示例是pprint.pprint,而不是print

相关问题 更多 >