Adding an interface to existing classes
Spencer Pearson
speeze.pearson at gmail.com
Thu Jan 5 02:54:49 EST 2012
(I'm sorry for my delayed response -- I've been travelling and not had
reliable Internet access.)
On 2011-12-25, Ian Kelly <ian.g.kelly at gmail.com> wrote:
> On Thu, Dec 22, 2011 at 1:21 AM, Spencer Pearson
><speeze.pearson at gmail.com> wrote:
>> I see a problem with this, though. The intersection of two lines is
>> (usually) an object of type Point. Since DrawableLine inherits from
>> Line, this means that unless I redefine the "intersect" method in
>> DrawableLine, the intersection of two DrawableLines will be a Point
>> object, not a DrawablePoint. I don't want to saddle the user with the
>> burden of converting every method output into its corresponding
>> Drawable subclass, and I don't want to redefine every method to return
>> an instance of said subclass. I see no other options if I continue
>> down the subclassing path. Am I missing something?
>
> You could solve this with a factory. Instead of having
> Line.intersection() create a Point directly, have it call
> self.factory.create_point(). In the drawing module, replace the
> factory for the subclasses with one that creates drawable classes
> instead.
Oh, that's a neat idea. Yes, I think that does exactly what I want!
Thanks very much!
> This will also work, but inheritance complicates things a
> little. ...
> ... Probably the easiest way to do this correctly is to follow the
> MRO that Python has conveniently already built for you. Something
> like:
>
> def draw(x, *args, **kwargs ):
> for class_ in type(x).__mro__:
> if class_ in draw_functions:
> draw_functions[class_](*args, **kwargs)
> break
> else:
> raise TypeError("don't know how to draw things of type "
> "{0}".format(type(x)))
You're right, you're right. My implementation was sloppy. I think I'll
go with your factory solution, but thanks for the fixed version of
draw() -- I've never seen __mro__ before, and it seems to be just the
tool for this job!
-Spencer
More information about the Python-list
mailing list