[Edu-sig] __init__ returning subclasses
Jay Bloodworth
jbloodworth@sc.rr.com
21 Oct 2001 21:14:45 -0400
Hiya,
This is really more a general programming question than a python-in-edu
question, but it's related to project for education that I'm working on,
and based on lurking for a while I'm pretty sure some members of the
list will have some interest and expertise to answer.
Say I have some class definitions like this:
class Expression:
stuff
class LinearExpression(Expression):
stuff
class QuadraticExpression(Expression):
stuff
Is there any way to make the Expression constructor return an instance
of one of the subclasses (based on its arguments) rather than an
Expression instance. E.G.
e=Expression("3x+5")
e.__class__ == <class LinearExpression>
e=Expression("x^2-9")
e.__class__ == <class QuadraticExpression>
I can think of plenty of workarounds involving helper functions and I
can think of a number reason why idiom given above might not be The
Right Thing whether or not it is possible. But I can't help thinking
that there is an elegance to this approach: Let the superclass choose
the appropiate subclass as an implementation, based on what it is
supposed to represent.
Similarly, can a class constructor choose not to construct a class and
instead return a base type object? For example (assuming Fraction is a
suitably designed class for rationals), can you do:
f=Fraction(1,2) # Fraction(n,d) => n/d
type(f) == <type 'instance'>
f=Fraction(2,1)
type(f) == <type 'int'>
Again, I can think of reasons not to do this, but it seems reasonable to
let the class pick the most appropriate implementation of itself as
possible, and if that is a builtin type, why not?
It's probably obvious from my examples that I'm interested in computer
algebra. I've found a few python CA systems: fewer than I'd expect,
more than I'd like to evaluate one by one, none well documented enough
for me to guess how easy to use/featureful they are. Anybody got any
advice/pointers for good, extensible computer algebra implementations
under python?
Thanks,
Jay