Function Overloading and Python

Gerald Klix Gerald.Klix at klix.ch
Mon Feb 25 03:50:45 EST 2008


Stefan Behnel schrieb:
> Allen Peloquin wrote:
>> On Feb 24, 11:44 pm, Stefan Behnel <stefan... at behnel.de> wrote:
>>> Allen Peloquin wrote:
>>>> class B
>>>> {
>>>>     fun(A x, A y, A z)...
>>>>     fun(A1 x, A y, A z)...
>>>> }
>>>> class B1
>>>> {
>>>>     fun(A1 x, A y, A z)...
>>>> }
>>>> Such that any previous behavior is inherited, but behaves
>>>> polymorphically because of the single function name.
>>> Try something like this:
>>>
>>> class B(object):
>>>     def fun(x,y,z):
>>>         if isinstance(x, A1):
>>>             return self._fun(x,y,z)
>>>         # ...
>>>
>>>     def _fun(x,y,z):
>>>         # ...
>>>
>>> class B1(B):
>>>     def _fun(x,y,z):
>>>         # ...
>>>
>>> Stefan
>> The problem is that I want to reuse the code of the parent classes
>> through inheritance, otherwise this would work fine.
> 
> Ok, I didn't see you were going to add new subtypes, that makes it more tricky
> to dispatch in the superclass.
> 
> An alternative would be a more generic dispatcher pattern then:
> 
>    class B(object):
>        _func_implementations = {}
>        _dispatch = _func_implementations.get
> 
>        def func(self, x,y,z):
>            self._dispatch(type(x), self._func)(self,x,y,z)
> 
>        def _func(self, x,y,z):
>            # ...
> 
>     class B1(B):
>        def _func(self, x,y,z):
>            # ...
> 
>     B._func_implementations[B1] = B1._func
> 
> Or, you could dispatch based on type /names/:
> 
>    class B(object):
>        def func(self, x,y,z):
>            func = getattr(self, "_%s_func" % type(x).__name__, self._func)
>            func(x,y,z)
> 
>        def _A_func(self, x,y,z):
>            # ...
> 
>     class B1(B):
>        def _A1_func(self, x,y,z):
>            # ...
> 
> Stefan

The BDFL came across that problem, too. You will find his thoughts here:
<http://www.artima.com/weblogs/viewpost.jsp?thread=101605>
The reference implementation for his solution is here:
<http://svn.python.org/view/sandbox/trunk/overload/>

HTH,
Gerald



More information about the Python-list mailing list