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