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.
--
http://mail.python.org/mailman/listinfo/python-list