Python 3.4 添加 了使用静态方法定义函数重载的功能。这本质上是文档中的示例:
from functools import singledispatch
class TestClass(object):
@singledispatch
def test_method(arg, verbose=False):
if verbose:
print("Let me just say,", end=" ")
print(arg)
@test_method.register(int)
def _(arg):
print("Strength in numbers, eh?", end=" ")
print(arg)
@test_method.register(list)
def _(arg):
print("Enumerate this:")
for i, elem in enumerate(arg):
print(i, elem)
if __name__ == '__main__':
TestClass.test_method(55555)
TestClass.test_method([33, 22, 11])
在其最纯粹的形式中, singledispatch
实现依赖于第一个参数来识别类型,因此很难将此功能扩展到实例方法。
有没有人对如何使用(或偷工减料)此功能使其与实例方法一起工作有任何建议?
原文由 Dustin Oprea 发布,翻译遵循 CC BY-SA 4.0 许可协议
查看
singledispatch
的 源码,我们可以看到装饰器返回了一个函数wrapper()
,它根据args[0]
的类型从注册的函数中选择一个函数来调用---
……这对于常规函数来说很好,但对于实例方法没有多大用处,它的第一个参数总是
self
。然而,我们可以编写一个新的装饰器
methdispatch
,它依赖于singledispatch
来完成繁重的工作,而是返回一个包装函数,该函数根据类型选择要调用的注册函数的args[1]
:这是一个使用装饰器的简单示例:
请注意,修饰的
get()
方法和注册到list
的方法都像往常一样具有初始self
参数。测试
Patchwork
类: