Bonjour,
Le pattern N.V.I., pour "non virtual interface" a été proposé par Herb Sutter dans son article "Virtuality, C/C++ Users Journal, 19(3), 2001" disponible ici:

http://www.gotw.ca/publications/mill18.htm

En résumé, il recommande, (quand on développe en C++) de rendre les fonctions virtuelles privées, et d'écrire une interface publique non virtuelle. Pour plus de détails sur ce pattern, je vous invite à lire l'article.

Utilisateur de python depuis peu, j'ai par réflexe appliqué les même recettes, considérée comme des bonnes pratiques dans mon langage de référence. Seulement le comportement qui en résulte n'est pas celui que j'attendais. En effet, si on considère l'exemple suivant:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class A:
    def foo(self):
        self.__foo_impl_private();
        self._foo_impl_protected();
 
    def __foo_impl_private(self):
        pass;
 
    def _foo_impl_protected(self):
        pass
 
class B(A):
    def __foo_impl_private(self):
        print 'coin'
 
    def _foo_impl_protected(self):
        print 'coin coin'
 
if __name__ == "__main__":
    x = B()
    x.foo()
A l'éxécution, ce code imprime
là ou je m'attendais à
On peut en déduire que le fait que __foo_impl_private soit privée empêche la classe de base d'appeler l'implémentation de la classe dérivée.

Quelqu'un peut-il m'éclairer sur ce comportement ? Il semble que l'idée préconçue selon laquelle les méthodes de classes en python se comportent comme des méthodes virtuelles en C++ soit erronée.