Les méthodes « privées » de Python : pas aussi impénétrables qu'elles le paraissent
Malgré l'idée fausse selon laquelle les méthodes « privées » de Python offrent une forte encapsulation, un un examen plus approfondi révèle qu'ils ne sont pas véritablement privés. Bien que préfixer une méthode avec des traits de soulignement doubles (__myPrivateMethod()) suggère une portée privée, cela crée en fait une méthode avec un nom modifié.
Par exemple, la classe suivante démontre ce comportement :
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!')
Lors de l'instanciation d'un objet de cette classe, on pourrait s'attendre à ne pas pouvoir accéder à la méthode privée :
obj = MyClass() obj.myPublicMethod()
Cependant, un appel ultérieur à dir(obj) révèle l'existence d'une méthode créée par magie :
dir(obj) ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
L'appel de cette méthode révèle les données "privées" :
obj._MyClass__myPrivateMethod()
Cette convention de dénomination est utilisée pour empêcher les sous-classes de remplacer par inadvertance les méthodes privées et les attributs de leurs superclasses. Cependant, cela n'empêche pas un accès délibéré de l'extérieur.
Par exemple :
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) x = Bar() x.foo() # 42 x.bar() # 21 print(x.__dict__) # {'_Bar__baz': 21, '_Foo__baz': 42}
En conclusion, les méthodes "privées" de Python ne sont pas véritablement privées, permettant aux sous-classes d'y accéder. Ce choix de conception donne la priorité à la flexibilité des sous-classes plutôt qu'à l'encapsulation stricte, mais il nécessite également une utilisation consciente par les développeurs pour maintenir l'intégrité du code.
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!