Roy Smith wrote: > Andy Leszczynski <leszczynscyATnospam.yahoo.com.nospam> writes: > (snip)
>>It's not a true statement. Nothing in the language enforces LSP. In >>fact, there's not even a [way?] when a function/method is invoked to make >>sure the type passed in is a subtype of the type you expect > > > Well, that's not entirely true. I could write: > > def func (self, obj): > assert (isinstance (obj, baseClass)) > > It's sort of un-pythonic, but the language certainly lets you do it if you > really want to. It doesn't inforce LSP anyway. class baseClass(object): def f(self): print "in %s f" % self return 42 class derivedClass(baseClass): f = "gotcha" class somethingElse(object) def f(self): return 42 def func1(obj): assert isinstance (obj, baseClass) obj.f() def func2(obj): assert(callable(getAttr(obj, f)) obj.f() b = baseClass() d = derivedClass() s = somethingElse() func1(b) # ok func1(d) # TypeError func1(s) # AssertionError func2(b) # ok func2(d) # AssertionError func2(s) # ok Clearly, somethingElse is a subtype of baseClass, when derivedClass is not. Don't confuse suclassing with subtyping. issinstance() let you check for subclassing, not for subtyping. The only language-level mechanism I know of that more or less inforce LSP is Eiffel's contracts. -- bruno desthuilliers python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for p in '[EMAIL PROTECTED]'.split('@')])" -- http://mail.python.org/mailman/listinfo/python-list