Pourquoi les méthodes « privées » de Python ne sont pas réellement privées
Malgré le préfixe double trait de soulignement couramment utilisé pour désigner les méthodes « privées » en Python, ces méthodes restent accessibles aux utilisateurs via une convention de dénomination légèrement différente.
L'interpréteur Python les renomme méthodes 'privées' vers "_ClassName__MethodName". Ainsi, la méthode prétendument « privée » « __myPrivateMethod() » peut être invoquée comme « _MyClass__myPrivateMethod() ».
Ce brouillage de nom n'est pas destiné à être une forme d'encapsulation ou à empêcher un accès extérieur. Au lieu de cela, cela sert à garantir que les sous-classes ne remplacent pas involontairement les méthodes « privées » de leurs superclasses.
Considérons l'exemple suivant :
class Foo(object): def __init__(self): self.__baz = 42 def foo(self): print(self.__baz) class Bar(Foo): def __init__(self): super(Bar, self).__init__() self.__baz = 21 def bar(self): print(self.__baz)
Lorsque nous créons une instance de Bar et appelons à la fois foo() et bar(), nous voyons le résultat suivant :
x = Bar() x.foo() 42 x.bar() 21
Comme en témoigne le résultat, la sous-classe remplace avec succès la valeur de __baz sans affecter l'attribut 'privé' de la superclasse. De plus, l'accès à x.__dict__ révèle que les deux versions de l'attribut __baz coexistent au sein de l'instance de sous-classe.
Bien que ce brouillage de nom puisse dissuader les remplacements accidentels, il n'empêche pas l'accès intentionnel aux méthodes « privées » à partir de sources externes. Par conséquent, les méthodes « privées » de Python ne sont pas véritablement privées et ne doivent pas être utilisées pour l'encapsulation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!