Variables privées en Python

Aditya Raj 30 janvier 2023
  1. Qu’est-ce qu’une variable privée en Python ?
  2. Comment implémenter une variable privée en Python ?
  3. Accéder aux variables privées en Python
  4. Conclusion des variables privées Python
Variables privées en Python

Les variables privées sont utilisées dans les programmes pour le contrôle d’accès. Les langages de programmation comme Java et C++ ont spécifié des mots-clés pour définir une variable privée.

En Python, nous n’avons pas de mot clé pour définir les variables privées. Cet article explique comment implémenter des variables privées et y accéder en utilisant le nom d’une classe.

Qu’est-ce qu’une variable privée en Python ?

Nous ne pouvons pas créer de variable privée en Python, mais nous pouvons simuler l’implémentation de variables privées en utilisant des conventions de dénomination spéciales.

On peut accéder à n’importe quel attribut d’un objet en utilisant la syntaxe objectName.attributeName. Regardez l’exemple.

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.SSN = SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.SSN)

Production :

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

Nous avons créé une classe Person avec les attributs name, age et SSN. Après avoir créé une instance person1 de la classe Person, nous avons accédé aux attributs name, age et SSN en dehors de la classe en utilisant la syntaxe person1.name, person1.age et person1.SSN.

Nous ne voulons pas que le SSN soit accessible en dehors de la définition de la classe. Nous n’avons aucun mot-clé pour créer une variable privée en Python. Alors comment simuler l’implémentation d’une variable privée ?

Comment implémenter une variable privée en Python ?

Pour implémenter une variable privée en Python, nous utiliserons un double trait de soulignement (__) avant le nom de la variable. Définissons l’attribut SSN de la classe Person à l’aide d’un double trait de soulignement.

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

Si nous créons une instance person1 de la classe Person et accédons à l’attribut __SSN en utilisant la syntaxe person1.__SSN, le programme affiche une erreur et lève l’exception AttributeError ci-dessous.

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.__SSN)

Production :

Name of the person is: Alex
Age of the person is: 15
/usr/lib/Python3/dist-packages/requests/__init__.py:89: RequestsDependencyWarning: urllib3 (1.26.7) or chardet (3.0.4) doesn't match a supported version!
  warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
Traceback (most recent call last):
  File "/home/aditya1117/PycharmProjects/PythonProject/string1.py", line 11, in <module>
    print("SSN of the person is:", person1.__SSN)
AttributeError: 'Person' object has no attribute '__SSN'

Nous pouvons accéder à tous les autres attributs sauf __SSN. Le programme dit qu’il n’y a pas d’attribut nommé __SSN. Comment accéder à la valeur dans l’attribut __SSN alors ?

Accéder aux variables privées en Python

Nous ne pouvons pas accéder à une variable privée en dehors de la définition de classe, mais nous pouvons y accéder à l’intérieur. Ainsi, nous pouvons créer une méthode à l’intérieur de la classe pour accéder à la valeur de la variable privée.

Nous pouvons créer une méthode nommée getSSN() qui renvoie la valeur de l’attribut __SSN comme indiqué ci-dessous.

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1.getSSN())

Production :

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

Au lieu de définir une méthode, nous pouvons accéder directement à la variable privée. Voyons comment les variables privées sont stockées dans la mémoire. Lorsque nous définissons un nom de variable avec le double trait de soulignement (__), l’interpréteur Python dit qu’il n’y a pas un tel attribut.

Pour comprendre comment la variable est stockée, nous allons vérifier tous les attributs de l’objet donné. Nous utiliserons la fonction dir(), qui prend un objet ou des arguments d’entrée et renvoie une liste de tous les attributs de l’objet. Vérifions les attributs de l’objet person1 à l’aide de la fonction dir().

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Attributes of the Person are:")
print(dir(person1))

Production :

Attributes of the Person are:
['_Person__SSN', '__doc__', '__init__', '__module__', 'age', 'getSSN', 'name']

Notez que les attributs name et age sont présents, mais qu’il n’y a pas d’attribut __SSN. Cependant, il existe un attribut nommé _Person__SSN. Imprimons la valeur de cet attribut pour l’objet person1.

class Person:
    def __init__(self, name, age, SSN):
        self.name = name
        self.age = age
        self.__SSN = SSN

    def getSSN(self):
        return self.__SSN


person1 = Person(name="Alex", age=15, SSN=1234567890)
print("Name of the person is:", person1.name)
print("Age of the person is:", person1.age)
print("SSN of the person is:", person1._Person__SSN)

Production :

Name of the person is: Alex
Age of the person is: 15
SSN of the person is: 1234567890

Notez que l’attribut _Person__SSN a la même valeur que __SSN. L’attribut __SSN est stocké en tant que _Person__SSN dans le programme. Chaque fois que nous accédons à l’attribut __SSN, le programme rencontre une exception AttributeError.

En Python, lorsque nous définissons un attribut en utilisant le double soulignement (__), le programme ajoute _className devant le nom de l’attribut. Ce processus est appelé mangling.

Python perçoit que les attributs nommés à l’aide de doubles traits de soulignement sont des variables privées dans la manipulation. Cependant, ce n’est pas vrai car nous pouvons accéder aux variables en utilisant la syntaxe _className__attributeName.

Conclusion des variables privées Python

Dans cet article, nous avons discuté des variables privées en Python. Nous avons vu que nous n’avons pas de mot-clé spécifique pour déclarer une variable privée en Python, contrairement aux autres langages de programmation. Cependant, nous pouvons simuler l’implémentation de variables privées en nommant les variables à l’aide d’un double trait de soulignement.

Nous avons également discuté de deux façons d’accéder aux variables privées en Python. Nous suggérons d’utiliser des méthodes pour accéder aux variables privées. L’utilisation de l’approche avec le nom de la classe détruira l’essence de l’implémentation des variables privées car nous accéderons directement à la variable. Le programme vous avertit d’accéder aux variables privées en utilisant le _className avant le nom de l’attribut.

Auteur: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

Article connexe - Python Variable