你的问题让我想起了我很久以前读到的Guido van Rossum关于用Python实现multimethods的一篇文章,因为在它的核心,这就是你正在做的
它需要进行调整以在类上工作,但我认为它可能是比使用setattr()来实现目标更好的方法
mm.py:
''' MultiMethod module. '''
_registry = {}
class MultiMethod(object):
def __init__(self, name):
self.name = name
self.typemap = {}
def __call__(self, *args):
types = tuple(arg.__class__ for arg in args)
function = self.typemap.get(types)
if function is None:
raise TypeError("no match")
return function(*args)
def register(self, types, function):
if types in self.typemap:
raise TypeError("duplicate registration")
print('registering: {!r} for args: {}'.format(function.__name__, types))
self.typemap[types] = function
def multimethod(*types):
def register(function):
name = function.__name__
mm = _registry.get(name)
if mm is None:
mm = _registry[name] = MultiMethod(name)
mm.register(types, function)
return mm
return register
registering: 'f' for args: (<class 'int'>,)
registering: 'f' for args: (<class 'str'>,)
f_str('answer') called
f_int(42) called
registering: 'f' for args: (<class 'float'>,)
f_float(3.141529) called
你的问题让我想起了我很久以前读到的Guido van Rossum关于用Python实现multimethods的一篇文章,因为在它的核心,这就是你正在做的
它需要进行调整以在类上工作,但我认为它可能是比使用
setattr()
来实现目标更好的方法mm.py:
示例用法
mm\u测试。py:
输出:
相关问题 更多 >
编程相关推荐