Defining a method final

holger krekel pyth at devel.trillke.net
Tue Jun 11 09:32:30 EDT 2002


Hello Fabio,

[you explained]
> I would like to define a method for a class which has
> not to be overriden. Of course, since the developer of
> this project are two, this could be established by
> convention, but if the project will grow consistently 
> another developer could override the method by mistake,
> causing unpleasant side effects.

I see. But did you know that usually pythonic objects work like this:

class stream:
    def readline(self):
        return ..someline...

class filestream:   # no inheritance needed!
    def readline(self):
        return ..readfromfile...

and that a method wanting to have an instance which it can
call readline on, would not need to check types etc...

def tokenize(provider):
    l=provider.readline()

works with a stream or a filestream-instance, it even works
with a 'file' instance or a StringIO-instance :-)

I imagine that this might sound fragile to you. But you
spare yourself and other a *lot* of effort if you don't
insist on exact type checking but rather use the
*behaviour* of objects. After all, working with behaviour 
is the great promise of OOP and python has it. Java/C++
would require you to group all objects into an
inheritance-hierarchy which usually makes things *more* 
difficult and verbose. 

OTOH for big enough programs (say >50.000 LOC) you should:

- write many tests which thoroughly check for desired behaviour
  (ask Peter Hansen for more details:-)

- dig deeper into 'interface' concepts for python. It's 
  also discussed on python-lists from time to time...

not that someone will certainly point out, that you should
write tests for smaller programs, too :-)

regards,

    holger





More information about the Python-list mailing list