[EMAIL PROTECTED] wrote:
> Hey, I have the following code that has to send every command it
> receives to a list of backends.
<snip>
> I would like to write each method like:
>
>     flush = multimethod()

Here's one way, using a metaclass:

class multimethod(object):
    def transform(self, attr):
        def dispatch(self, *args, **kw):
            results = []
            for b in self.backends:
                results.append(getattr(b, attr)(*args, **kw))
            return results
        return dispatch

def multimethodmeta(name, bases, dict):
    """Transform each multimethod object into an actual method"""
    for attr in dict:
        if isinstance(dict[attr], multimethod):
            dict[attr] = dict[attr].transform(attr)
    return type(name, bases, dict)

class MultiBackend(object):
    __metaclass__ = multimethodmeta
    def __init__(self, backends):
        self.backends = backends
    add = multimethod()

class Foo(object):
    def add(self, x, y):
        print 'in Foo.add'
        return x + y

class Bar(object):
    def add(self, x, y):
        print 'in Bar.add'
        return str(x) + str(y)

m = MultiBackend([Foo(), Bar()])
print m.add(3, 4)

# Output:
in Foo.add
in Bar.add
[7, '34']

--Ben

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to