Designing superclasses so inherited methods return objects with same type as the instance.

Arnaud Delobelle arnodel at googlemail.com
Wed Nov 19 17:05:41 EST 2008


"Felix T." <Fjt72701 at yahoo.com> writes:

> I have a class called Interval(type.ObjectType) that is supposed to
> mimic closed mathematical intervals. Right now, it has a lot of
> methods like this:
>
>     def __add__(self,other):
>         if type(other) in Numerical:
>             return Interval(self.lower_bound+other, self.upper_bound
> +other)
>         else:
>             return Interval(self.lower_bound+other.lower_bound,
>                             self.upper_bound+other.upper_bound)
>
> that return new objects of the same type.
>
> The problem is that if this method is called by a subclass like
>
> class HalfOpen(Interval):
>       #new comparison methods
>       ...
> it returns an object with Interval (not HalfOpen) type.
>
>
> I either have to redefine methods like __add__ so that they return
> objects of the right type (even though the logic is the same) or find
> some way to redefine Interval's methods so they are more flexible.
> Right now, I am looking at:
>
>     def __add__(self,other):
>         if type(other) in Numerical:
>             return self.__class__(self.lower_bound+other,
> self.upper_bound+other)
>         else:
>             return self.__class__(self.lower_bound+other.lower_bound,
>                             self.upper_bound+other.upper_bound)
>
> Is there a standard way to do this, or a better one?

You can use type(self) rather than self.__class__

But I wouldn't make HalfOpen descend from Interval as a half-open
interval is not a kind of closed interval.  Moreover you should have

     Interval(2, 3) + HalfOpen(5, 7) == HalfOpen(7, 10)

Your implementation will yield Interval(7, 10) if I understand
correctly.

I think if I implemented an Interval class I would have it something
like this:

class Interval:
    def __init__(self, left, right, closed_left=True, closed_right=True):
        ...

-- 
Arnaud



More information about the Python-list mailing list