In article <mailman.2087.1361343028.2939.python-l...@python.org>, Chris Angelico <ros...@gmail.com> wrote:
> On Wed, Feb 20, 2013 at 2:38 PM, Terry Reedy <tjre...@udel.edu> wrote: > > Liskov Substitution Principle (LSP): I met this over 15 years ago reading > > debates among OOP enthusiasts about whether Rectangle should be a subclass > > of Square or Square a subclass of Rectangle, and similarly, whether Ostrich > > can be a legitimate subclass of Bird. > > > > The problem I see with the LSP for modeling either abstract or concrete > > entities is that we in fact do define subclasses by subtraction or > > limitation, as well as by augmentation, while the LSP only allows the > > latter. > > A plausible compromise is to demand LSP in terms of programming, but > not necessarily functionality. So an Ostrich would have a fly() method > that returns some kind of failure, in the same way that any instance > of any flying-bird could have injury or exhaustion that prevents it > from flying. It still makes sense to attempt to fly - an ostrich IS a > bird - but it just won't succeed. > > ChrisA I would think Ostrich.fly() should raise NotImplementedError. Whether this violates LSP or not, depends on how you define Bird. class Bird: def fly(self): """Commence aviation. Note: not all birds can fly. Calling fly() on a flightless bird will raise NotImplementedError. """ class Ostrich(Bird): def fly(self): raise NotImplementedError("ostriches can't fly") class Sheep(Bird): def fly(self): self.plummet() -- http://mail.python.org/mailman/listinfo/python-list