strategy pattern and non-public virtual functions

Duncan Booth duncan.booth at invalid.invalid
Mon Jun 5 10:27:04 EDT 2006


 wrote:

> The users of the derived classes are unable to bypass this base class
> function.

Just to be clear, the users of the derived C++ classes *are* able to bypass 
the base class function and call f_() directly, they just have to be 
prepared to twist the rules somewhat. I know: I've been in the situation 
where there was absolutely no other way to get the job done other than to 
call a private method in a class supplied in a library which I couldn't 
change.

To do the same in Python you simply make a rule 'dont call f_ directly' and 
you get effectively the same thing: users can call f_ if they really want, 
but they are breaking the rules if they do. The difference in Python is 
that you don't have to go to such extremes to break the rules.

The Pythonic way to do it:

class B(object):
    def f(self):
        self._f()

class D(B):
    def _f(self):
        pass

d = D()
d.f()

Calling a method with a single leading underscore from outside the 
implementation of the class is generally accepted in Python to be 'breaking 
the rules' and therefore something only to be done by consenting adults in 
the full knowledge of the consquences of their actions.



More information about the Python-list mailing list