Are there 'Interfaces' in Python??

Tim Hammerquist tim at vegeta.ath.cx
Wed Sep 26 18:25:57 EDT 2001


Me parece que Titus Brown <t at chabry.caltech.edu> dijo:
> In article <dqvso9.rgl.ln at 10.0.0.1>, Carl Banks  <idot at vt.edu> wrote:
> >tszeto <tszeto at mindspring.com> wrote:
> >> Hello,
> >> 
> >> Was wondering if Python supported 'Interfaces' (something akin to Java
> >> interfaces)? Or if there's a workaround to get the same thing.
> >
> >IMHO, ***THE*** best thing about Python is that inheritance and
> >interfaces and other such tricks are not required to get polymorphic
> >behavior.
> >
> >Take, for example, StringIO objects.  They are not syntactically
> >related to File objects in any way: neither is derived from the other,
> >they are not derived from a common base class, and they do not
> >implement a common "official" interface.  Yet, because StringIO
> >objects provide the same methods that File objects provide, one can
> >use StringIO object as if they were an ordinary File objects.
> >
> >Basically, if something looks like a File object, and acts like a File
> >object, one can use it like a File object.  So, unlike Java, you don't
> >need interfaces to get polymorphic behavior in Python.
> 
> I'm not clear why this is such a GOOD thing.  It's not necessarily BAD,
> unless you (for example) have to debug the 'rfc822' module, which assumes
> that any file-like object which has 'seek' must have 'tell', but doesn't
> indicate in any way what the lack of both affects handling, and furthermore
> raises an error if you have one but not the other.
> 
> There's also the mystifying lack of 'readlines' on StringIO objects
> in Python before 2.0.  Does a file-object-like-thing have to have
> readlines?  Well, they all do now -- how about seek? tell? read() behavior?
> You tell me, after going and looking at all the file-object-like-things
> in the distribution.  Oh -- but wait, you can't find them all, because
> they're all unrelated...
> 
> I would rather regard this as neutral & a convenience for people writing
> code that uses file-object-like-things.  It's certainly not a convenience
> for people writing new classes that attempt to emulate the behavior of
> already-existing objects with unclear definitions, and it sure would be
> nice to have the option of some type checking built into the language,
> but I understand why it's not there and appreciate the convenience.  But
> there are downsides too...

This sounds like one of the many threads in c.l.smalltalk. :)

If you want to use interface-style type checking, the following might
work for you:

class MyInterface:
    # define

class MyIFClass1(MyInterface):
    # implement

class MyIFClass2(MyInterface):
    # implement

class MyIFException(Exception, MyInterface):
    # implement and extend

and use isinstance(obj, MyInterface) to see if it implements it.

It doesn't survive someone deleting keys from the o.__dict__ attribute,
but Python's run-time nature precluded that long ago, didn't it?

-- 
I'm not an alien. I'm discontent.
    -- Stan, "The Faculty"



More information about the Python-list mailing list