help needed with classes/inheritance
Bruno Desthuilliers
bruno.42.desthuilliers at websiteburo.invalid
Wed Apr 23 08:45:45 EDT 2008
Andrew Lee a écrit :
(snip)
> as a rule of thumb .. if you are using "isinstance" in a class to
> determine what class a parameter is ... you have broken the OO contract.
Nope.
> Remember, every class ought to have a well defined internal state and a
> well defined interface to its state.
I don't see how the part about the internal state relates to the problem
here.
> If I write --
>
> class foo (object):
> def __init__ :
> pass
>
> def some_func (self, val) :
> if isinstance (val, "bar") :
> ....
>
> Then I am either doing something very wrong
If you do so in a desperate attempt to emulate static typing in Python,
then yes, you're doing something very wrong. Else:
> or very clever
Not necessarily. Given Python's dynamic typing, there's no builtin
OneObviousWay(tm) way to dispatch on different functions based on
argument's type - something often done in statically typed OOPLs using
method overridding (ie: different methods with same name but different
signatures). Doing a manual dispatch based on argument's type, while not
good OO style, is sometimes the simplest working solution, and a good
enough one for the problem at hand. Having different methods for
different arg types has the drawback that you don't have one single
generic function/method that you can use as a callback.
Having a real multidispatch (or rule-based dispatch etc) system either
builtin or in the stdlib would indeed be much cleaner. Until then, there
are a couple third-part packages solving this problem, but it can be
overkill for simple problems (and add unneeded/unwanted dependencies).
my 2 cents.
More information about the Python-list
mailing list