callable virtual method

Jean-Michel Pichavant jeanmichel at sequans.com
Fri Aug 14 17:00:01 EDT 2009


Dave Angel wrote:
> Jean-Michel Pichavant wrote:
>> <div class="moz-text-flowed" style="font-family: -moz-fixed">Nigel 
>> Rantor wrote:
>>> Jean-Michel Pichavant wrote:
>>>>
>>>> Your solution will work, for sure. The problem is that it will dumb 
>>>> down the Base class interface, multiplying the number of methods by 
>>>> 2. This would not be an issue in many cases, in mine there's 
>>>> already too much meaningful methods in my class for me to add 
>>>> artificial ones.
>>>>
>>>> Thanks for the tip anyway.
>>>
>>> I suggest you reconsider.
>>>
>>> You asked a question and have been given a standard way of achieving 
>>> the desired outcome.
>>>
>>> It's common in OO to use a Template pattern like this.
>>>
>>> If you're not interested in finding out how loads of people have 
>>> already solved the problem then why ask?
>>>
>>> The methods that require overriding can be prefixed with an 
>>> underscore so that people get a hint that they are an implementation 
>>> detail rather than part of the public interface.
>>>
>>> I don't see your problem, other than a vague aesthetic unease.
>>>
>>> Regards,
>>>
>>>   n
>> I understand how refuting some obvious solution may look just stupid. 
>> You're right, I shouldn't have asked.
>>
>> By the way I'd like to know if I am I alone to find that
>>
>> class Stream:
>>    def start
>>    def stop
>>    def reset
>>
>> is better than
>>
>> class Stream:
>>    def start
>>    def _start
>>    def stop
>>    def _stop
>>    def reset
>>    def _reset
>>
>> (try to figure out with 20+ methods)
>> What you call aesthetic may sometimes fall into readability.
>>
>>
>> JM
>>
>>
>> </div>
>>
> Usually when one defines an abstract base class, one expects many 
> people will derive from it, as opposed to only one having to write 
> it.  So if the base must be "ugly" according to some definition, so be 
> it.  Aesthetics are quite subjective.
>
> Nigel's approach has another benefit not stated, which is to keep the 
> child class code simpler.  They avoid the need to call any base class 
> method to access the common logic.  The downside is it assumes that 
> the common logic will always be either at the beginning or always at 
> the end of the child classes implementation.  That's because the base 
> class has hardcoded where in its implementation to call the child 
> class method.
>
I think this is a severe issue.
You prevent the sub class from writing
def foo(self):
    pre()
    Base.foo(self)
    post()
> Anyway, without arguing for or against either approach, I'd point out 
> that you could have an extra formal parameter in the base method, 
> which is a private signal from the child class that this is the 
> internal call.  Missing such a formal parameter would then trigger the 
> "missing method in derived class" error message.  You'd check such a 
> parameter the same place as you're now checking the object's type.
>
> DaveA
>
>


talking about approaches:

1/
class Interface:
    def foo(self):
       if self.__class__.foo == Interface.foo:
          raise NotImplementedError

2/
class Interface:
    def foo(self):
       self._foo()

    def _foo(sef):
       raise NotImplementedError

Are they so different ? They both require about the same amount of extra 
characters, they're both readable. The second is a very classic OO 
layout, the first is more flexible for the sub classes and spare some 
method definition.

This thread may live again, I cannot say but I'd like to thanks all who 
gave me their valuable idea on the subject, I mean it. Please don't take 
my skepticism as a lack of consideration.

JM





More information about the Python-list mailing list