Maison > développement back-end > Tutoriel Python > L'encapsulation de méthode « privée » de Python est-elle un mythe ?

L'encapsulation de méthode « privée » de Python est-elle un mythe ?

Mary-Kate Olsen
Libérer: 2024-12-05 19:16:11
original
865 Les gens l'ont consulté

Is Python's

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()
Copier après la connexion

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']
Copier après la connexion

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}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal