Python – Membres publics, Protégés, privés
Les langages orientés objet classiques, tels que C++ et Java, contrôlent l’accès aux ressources de classe par des mots-clés publics, privés et protégés. Les membres privés de la classe se voient refuser l’accès de l’environnement extérieur à la classe. Ils ne peuvent être gérés que depuis la classe.
Membres publics
Les membres publics (généralement les méthodes déclarées dans une classe) sont accessibles depuis l’extérieur de la classe. L’objet de la même classe est requis pour appeler une méthode publique. Cette disposition des variables d’instance privées et des méthodes publiques assure le principe d’encapsulation des données.
Tous les membres d’une classe Python sont publics par défaut. Tout membre est accessible depuis l’extérieur de l’environnement de classe.
Copiez
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
Vous pouvez accéder aux attributs de la classe Student
et également modifier leurs valeurs, comme indiqué ci-dessous.
Copy
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
Membres protégés
Les membres protégés d’une classe sont accessibles depuis l’intérieur de la classe et sont également disponibles pour ses sous-classes. Aucun autre environnement n’est autorisé à y accéder. Cela permet d’hériter des ressources spécifiques de la classe parent par la classe enfant.
La convention de Python pour protéger une variable d’instance est d’y ajouter un préfixe _ (trait de soulignement unique). Cela empêche efficacement son accès à moins qu’il ne provienne d’une sous-classe.
Copy
class Student: _schoolName = 'XYZ School' # protected class attribute def __init__(self, name, age): self._name=name # protected instance attribute self._age=age # protected instance attribute
En fait, cela n’empêche pas les variables d’instance d’accéder ou de modifier l’instance. Vous pouvez toujours effectuer les opérations suivantes :
Copy
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
Cependant, vous pouvez définir une propriété à l’aide du décorateur de propriétés et la protéger, comme indiqué ci-dessous.
Copiez
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
Ci-dessus, @property decorator est utilisé pour faire de la méthode name()
comme propriété et @name.setter
décorateur une autre surcharge du en tant que méthode de définition de propriétés. Maintenant, _name
est protégé.
Copie
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
Ci-dessus, nous avons utilisé la propriété std.name
pour modifier l’attribut _name
. Cependant, il est toujours accessible en Python. Par conséquent, le programmeur responsable s’abstiendrait d’accéder et de modifier les variables d’instance préfixées par _
depuis l’extérieur de sa classe.
Membres privés
Python n’a aucun mécanisme qui limite efficacement l’accès à toute variable ou méthode d’instance. Python prescrit une convention de préfixer le nom de la variable / méthode avec un trait de soulignement simple ou double pour émuler le comportement des spécificateurs d’accès protégés et privés.
Le double trait de soulignement __
préfixé à une variable la rend privée. Cela donne une forte suggestion de ne pas le toucher de l’extérieur de la classe. Toute tentative de le faire entraînera une erreur d’attribut :
Copy
class Student: __schoolName = 'XYZ School' # private class attribute def __init__(self, name, age): self.__name=name # private instance attribute self.__salary=age # private instance attribute def __display(self): # private method print('This is private method.')
Copy
>>> std = Student("Bill", 25)>>> std.__schoolNameAttributeError: 'Student' object has no attribute '__schoolName'>>> std.__nameAttributeError: 'Student' object has no attribute '__name'>>> std.__display()AttributeError: 'Student' object has no attribute '__display'
Python effectue une modification du nom des variables privées. Chaque membre avec un double trait de soulignement sera remplacé par _object._class__variable
. Ainsi, il est toujours accessible depuis l’extérieur de la classe, mais la pratique doit être évitée.
Copy
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
Ainsi, Python fournit une implémentation conceptuelle de modificateurs d’accès publics, protégés et privés, mais pas comme d’autres langages comme C #, Java, C++.
Leave a Reply