Guido van Rossum wrote:
Guido> The exception is when you need to do something different based Guido> on the type of an object and you can't add a method for what Guido> you want to do. But that is relatively rare.
Perhaps the reason it's rare is that it's difficult to do.
Perhaps... Is it the chicken or the egg?
Once you've defined interfaces you do end up using them this way, I've found in my own experiences. It can be more clear than the alternative if you have a set of objects in some collection that fall apart in a number of kinds -- 'content' versus 'container' type things in Zope for instance. It's nice to be able to say 'is this a container' without having to think about implementation inheritance hierarchies or trying to call a method that should exist on a container and not on a content object. And of course Zope3 uses interfaces in more advanced ways to associate objects together automatically -- a view for a content object is looked up automatically by interface, and you can automatically hook adapters that translate one interface to another together by looking them up in an interface registry as well. [snip]
BTW A the original scarecrow proposal is at http://www.foretec.com/python/workshops/1998-11/dd-fulton-sum.html
I recall looking at that for the first time and not understanding too much about the reasoning behind it, but by now I have some decent experience with the descendant of that behind me (the interface package in Zope), and it's quite nice. Many people seem to react to interfaces by associating them with static types and then rejecting the notion, but Python interface checking is just as run-time as anything else. By the way, the Twisted people are starting to use interfaces in their package; a home grown very simple implementation at first but they are trying to stay compatible with the Zope ones and are looking into adopting the Zope interface package proper. When I first discussed interfaces with some Twisted developers a year ago or so their thinking seemed quite negative, but they seem to be changing their minds, at least slowly. That's a good sign for interfaces, and I imagine it will happen with more people. Interfaces in Python are almost too trivial to understand, but surprisingly useful. I imagine this is why so many smart Python users don't get it; they either reject the notion because it seems too trivial and 'therefore useless', or because they think it must involve far more complication (static typing) and therefore it's too complicated and not in the spirit of Python. :) Regards, Martijn