如何在实例方法中使用functools.singledispatch?

如何在实例方法中使用functools.singledispatch?,第1张

如何在实例方法中使用functools.singledispatch?

更新: 从Python
3.8开始,

functools.singledispatchmethod
允许对方法,类方法,抽象方法和静态方法进行单次调度。

对于较旧的Python版本,请参见此答案的其余部分。

纵观来源的

singledispatch
,我们可以看到,装饰返回一个函数
wrapper()
,它选择的功能,从那些基于类型免费通话
args[0]

    def wrapper(*args, **kw):        return dispatch(args[0].__class__)(*args, **kw)

…对于常规函数来说很好,但是对于实例方法来说用的很少,实例方法的第一个参数始终是

self

但是,我们可以编写一个新的decorator

methdispatch
,它依赖于
singledispatch
执行繁重的工作,而是返回一个包装器函数,该函数根据以下类型选择要调用的注册函数
args[1]

from functools import singledispatch, update_wrapperdef methdispatch(func):    dispatcher = singledispatch(func)    def wrapper(*args, **kw):        return dispatcher.dispatch(args[1].__class__)(*args, **kw)    wrapper.register = dispatcher.register    update_wrapper(wrapper, func)    return wrapper

这是使用的装饰器的一个简单示例:

class Patchwork(object):    def __init__(self, **kwargs):        for k, v in kwargs.items(): setattr(self, k, v)    @methdispatch    def get(self, arg):        return getattr(self, arg, None)    @get.register(list)    def _(self, arg):        return [self.get(x) for x in arg]

请注意,修饰的

get()
方法和注册的方法
list
self
照常具有初始参数。

测试

Patchwork
课程:

>>> pw = Patchwork(a=1, b=2, c=3)>>> pw.get("b")2>>> pw.get(["a", "c"])[1, 3]


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5630119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存