A generic question: idiom for a paramterized base class?

Jonathan Hogg jonathan at onegoodidea.com
Thu Aug 1 18:38:03 EDT 2002


On 1/8/2002 10:11, in article
918bc22f.0208010111.23b016f6 at posting.google.com, "Donnal Walter"
<donnal at donnal.net> wrote:

> You are welcome. I am glad my suggestion proved helpful. But it seems
> to me that you are still trying to make things too complicated.
[...]
> Try this:
> 
> ###########################################
> class AbstractBase(object):
>    def __iadd__(self,other):
>        return self.TAdd(self,other)
>    def __add__(self,r):
>        return AbstractBase.__iadd__(self,r)
>    def __radd__(self,l):
>        return AbstractBase.__iadd__(l,self)
>    class TAdd(object): pass
> 
> class TNode1(AbstractBase):
> 
>    def __init__(self):
>        print "TNode1 instance"
> 
>    class TAdd(AbstractBase):
>        def __init__(self,l,r):
>            print "TAdd1 instance"
> 
> class TNode2(AbstractBase):
> 
>    def __init__(self):
>        print "TNode2 instance"
> 
>    class TAdd(AbstractBase):
>        def __init__(self,l,r):
>            print "TAdd2 instance"
> ###########################################

I'm afraid I don't think this will work.

% python -i TNode.py
>>> x = TNode1()
TNode1 instance
>>> y = TNode1()
TNode1 instance
>>> z = TNode1()
TNode1 instance
>>> x + y
TAdd1 instance
<__main__.TAdd object at 0x41c2b0>
>>> _ + z
<__main__.TAdd object at 0x41c930>
>>> 

Spot the missing call to the TNode1.TAdd constructor - that final TAdd is an
AbstractBase.TAdd.

I fear the solution is much more subtle. Though it's too late at night for
me to work it out, so I'll leave it as an exercise for some other reader ;-)

-try-Haskell's-parameterised-type-classes-;)-ly y'rs,

Jonathan




More information about the Python-list mailing list