Les méthodes « privées » de Python : dévoiler le mythe de l'encapsulation
Contrairement à leur nom, les méthodes « privées » de Python ne sont pas entièrement privées. Alors que l'ajout de doubles traits de soulignement au nom d'une méthode (par exemple, __myPrivateMethod()) crée l'illusion de confidentialité, Python expose ces méthodes via une méthode générée dynamiquement avec un nom modifié.
Considérez le code suivant :
class MyClass: def myPublicMethod(self): print('public method') def __myPrivateMethod(self): print('this is private!!') obj = MyClass()
L'appel de obj.myPublicMethod() appelle avec succès la méthode publique. Cependant, tenter d'appeler obj.__myPrivateMethod() entraîne une AttributeError.
En approfondissant le sujet avec dir(obj), nous découvrons une nouvelle méthode :
dir(obj) # Output: ['_MyClass__myPrivateMethod', '__doc__', '__module__', 'myPublicMethod']
Cette méthode générée dynamiquement La méthode, nommée _MyClass__myPrivateMethod, conserve la référence au soi-disant privé méthode.
Malgré le brouillage de noms, le but n'est pas d'empêcher un accès externe délibéré. Au contraire, cela garantit que les sous-classes ne remplacent pas accidentellement les méthodes privées et les attributs des superclasses. Prenons 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) x = Bar() x.foo() # Output: 42 x.bar() # Output: 21 print(x.__dict__) # Output: {'_Bar__baz': 21, '_Foo__baz': 42}
Les sous-classes peuvent toujours accéder à l'attribut ou à la méthode privée remplacée via le nom modifié.
En résumé, les méthodes « privées » de Python ne sont pas vraiment privées dans le sens des principes de programmation orientée objet. Ils ne constituent qu'un mécanisme destiné à empêcher les dérogations accidentelles, mais ils n'offrent aucune protection contre un accès externe délibéré.
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!