Maison > développement back-end > Tutoriel Python > Dans quelle mesure les méthodes « privées » de Python sont-elles vraiment privées ?

Dans quelle mesure les méthodes « privées » de Python sont-elles vraiment privées ?

Barbara Streisand
Libérer: 2024-12-11 12:15:11
original
610 Les gens l'ont consulté

How Private Are Python's

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

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

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

L'appel de cette méthode révèle les données "privées" :

obj._MyClass__myPrivateMethod()
Copier après la connexion

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

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!

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