callable virtual method

Jean-Michel Pichavant jeanmichel at sequans.com
Fri Aug 14 16:22:10 EDT 2009


Steven D'Aprano wrote:
> On Fri, 14 Aug 2009 18:49:26 +0200, Jean-Michel Pichavant wrote:
>
>   
>> Sorry guys (means guys *and* gals :op ), I realized I've not been able
>> to describe precisely what I want to do. I'd like the base class to be
>> virtual (aka abstract). However it may be abstract but it does not mean
>> it cannot do some usefull stuff.
>>
>>
>> Here is the schema of my abstract methods :
>>
>> class Interface(object):
>>     def method(self):
>>         # ---------------------
>>         # some common stuff executed here
>>         # ---------------------
>>         print 'hello world'
>>         # ---------------------
>>         # here shall stand child specific stuff (empty in the interface
>> method)
>>         # ---------------------
>>         if self.__class__.method == Interface.method:
>>             raise NotImplementedError('You should have read the f******
>> manual ! You must override this method.')
>>     
>
>
> Okay, so I want to sub-class your Interface class. As you said, the 
> methods in the abstract class are still useful, so in my class, I don't 
> need any extra functionality for some methods -- I'm happy with just the 
> "common stuff". So I use normal OO techniques and over-ride just the 
> methods I need to over-ride:
>
>   
Sometimes the base is doing cool stuff but incomplete stuff which 
requires knowledge only hold by the sub class. In my case the interface 
is a high level interface for a software that can run on multiple 
hardware platforms. Only the sub class has knowledge on how to operate 
the hardware, but no matter the hardware it still produces the same effect.

Let's say I have 50 different hardwares, I'll have 50 sub classes of 
Interface with the 'start' method to define. It wouldn't be appropriate 
(OO programming)to write 50 times '_log.debug('Starting %s' % self)' in 
each child start method when the simple task of logging the call can be 
nicely handled by the base class.

In the meantime, I must make sure  the user, who is not a python guru in 
this case, has implemented the start method for his hardware, because 
only him knows how to effectively start this hardware. I don't want him 
to come to me saying, "I got no error, still my hardware does not 
start". You can then blame him for not reading the docs, but it will 
still be less expensive to throw a nice exception with an accurate feedback.

[snip]
> class VerboseGoodChild(Interface):
>     # forced to over-ride methods for no good reason
>   

Definitely no !! This is the purpose of an interface class: to force 
people to write these methods. They *are* required, if they were not, 
they would not belong to the Interface.

JM



More information about the Python-list mailing list