我刚刚从functools了解了@singledispatch运算符。我的第一个想法是,我现在会在任何地方使用这个,因为我经常写这样的函数。但我已经使用Python几年了,以前从未遇到过这种情况,这很可怕。
为什么其他人不到处都用这个?是否有我不知何故错过的昂贵的权衡?
关于何时使用或不使用@singledispatch,是否有某种官方指导?
singledispatch decorator只是实现多态性的几种方法之一,虽然它通过多方法在Clojure等语言中广泛使用,但它在Python领域并不常见。
在面向对象的语言中,你通常可以看到多态性应用于类级别,其中对象定义了一个方法,它的派生子集合调整了它的行为。这反过来又是一种单调度的形式,它隐含在对象的类类型中,即实现是根据self
参数而不是实际的方法输入参数来调度的。
应用多态性的另一种流行方式是我所说的"多态性";鸭子多态性";。为了澄清问题,这方面的一个例子是列表和字典的pop
方法。在这个例子中,两个对象在抽象行为级别上实现了相同的方法,这些方法将东西删除到集合中,它们共享核心思想,但实现不同,它们之间没有类层次结构。在某种意义上,它们类似于接口,但在不那么严格的意义上,你像鸭子一样嘎嘎作响,所以我可以像对待你一样对待你,而不会破坏代码。
总而言之,似乎更多地使用其他方式来实现相同的行为,最终这一切都取决于开发人员喜欢如何构建他们的代码。
回到其他问题,我(天真地(不会说使用decorator会带来巨大的性能损失,尽管与直接调用一个函数相比,肯定会涉及更多的查找和函数调用。
关于官方建议,最好阅读PEP443。在这里,你会发现一个历史概述,为什么它被添加到语言中。
EDIT:Miyagui所做的一些重要更正。
- Dictionaries没有append方法
- 类文件对象实际上是从基本对象派生的
- Print不分派参数类型,而是调用参数的str或repr方法。实际上,政治公众人物中的单一调度的例子是pprint.print,而不是print