Can methods and functions be overloaded?

Carel Fellinger cfelling at iae.nl
Fri Feb 16 10:24:36 EST 2001


Steve Holden <sholden at holdenweb.com> wrote:
...
> Does this help, or did you alredy know about it? I'm afraid Python doesn't
> allow the same kind of method overloading by signature that, say, Java and
> C++ do.

Right, but you can build your own:)

class Overload:
    def __init__(self):
        self.fun = {}

    def __call__(self, *args):
        try:
            fun = self.fun[self.signature(*args)]
        except KeyError:
            raise TypeError, "invalid overloading signature"
        return fun(*args)

    def signature(self, *args):
        '''smart up if you need to play with class hierarchies'''
        return tuple([type(x) for x in args])

    def overload(self, fun, *args):
        self.fun[self.signature(*args)] = fun


class Overloaded:
    def __init__(self):
        f = self.f = Overload()
        f.overload(self.f_None)
        f.overload(self.f_num, 1)
        f.overload(self.f_num, 1.0)
        f.overload(self.f_string, "1")
        f.overload(self.f_more, 'spam', 1)

    def f_None(self):
        return None

    def f_num(self, n):
        return n * 3

    def f_string(self, s):
        return 'string is %s' % s

    def f_more(self, s, n):
        return s * n

o = Overloaded()

print o.f()
print o.f(10)
print o.f(5.4)
print o.f("spam", 9)
print o.f(9, "spam")


this yields:

None
30
16.2
spamspamspamspamspamspamspamspamspam
Traceback (most recent call last):
  File "t.py", line 48, in ?
    print o.f(9, "spam")
  File "t.py", line 9, in __call__
    raise TypeError, "invalid overloading signature"
TypeError: invalid overloading signature

-- 
groetjes, carel



More information about the Python-list mailing list