Variables privadas en Python

Aditya Raj 30 enero 2023
  1. ¿Qué es una variable privada en Python?
  2. ¿Cómo implementar una variable privada en Python?
  3. Acceder a variables privadas en Python
  4. Conclusión de las variables privadas de Python
Variables privadas en Python

Las variables privadas se utilizan en programas para el control de acceso. Los lenguajes de programación como Java y C++ tienen palabras clave específicas para definir una variable privada.

En Python, no tenemos una palabra clave para definir variables privadas. Este artículo discutirá cómo implementar variables privadas y acceder a ellas usando el nombre de una clase.

¿Qué es una variable privada en Python?

No podemos crear una variable privada en Python, pero podemos simular la implementación de variables privadas utilizando convenciones de nomenclatura especiales.

Podemos acceder a cualquier atributo de un objeto utilizando la sintaxis objectName.attributeName. Mira el ejemplo.

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)

Producción :

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

Hemos creado una clase Person con los atributos name, age y SSN. Luego de crear una instancia person1 de la clase Person, accedimos a los atributos name, age y SSN fuera de la clase usando la sintaxis person1.nombre, person1.edad y person1.SSN.

No queremos que se acceda al SSN fuera de la definición de clase. No tenemos ninguna palabra clave para crear una variable privada en Python. Entonces, ¿cómo debemos simular la implementación de una variable privada?

¿Cómo implementar una variable privada en Python?

Para implementar una variable privada en Python, usaremos un guión bajo doble (__) antes del nombre de la variable. Definamos el atributo SSN de la clase Person usando doble guión bajo.

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

Si creamos una instancia person1 de la clase Person y accedemos al atributo __SSN utilizando la sintaxis person1.__SSN, el programa muestra un error y lanza la excepción AttributeError a continuación.

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)

Producción :

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'

Podemos acceder a todos los demás atributos excepto __SSN. El programa dice que no hay ningún atributo llamado __SSN. ¿Cómo podemos acceder al valor en el atributo __SSN entonces?

Acceder a variables privadas en Python

No podemos acceder a una variable privada fuera de la definición de clase, pero podemos acceder a ella dentro. Entonces, podemos crear un método dentro de la clase para acceder al valor de la variable privada.

Podemos crear un método llamado getSSN() que devuelva el valor del atributo __SSN como se muestra a continuación.

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())

Producción :

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

En lugar de definir un método, podemos acceder directamente a la variable privada. Veamos cómo se almacenan las variables privadas en la memoria. Cuando definimos un nombre de variable con el doble guión bajo (__), el intérprete de Python dice que no existe tal atributo.

Para comprender cómo se almacena la variable, comprobaremos todos los atributos del objeto dado. Usaremos la función dir(), que toma un objeto o argumentos de entrada y devuelve una lista de todos los atributos del objeto. Comprobemos los atributos del objeto person1 utilizando la función 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))

Producción :

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

Observe que los atributos name y age están presentes, pero no hay atributo __SSN. Sin embargo, hay un atributo llamado _Person__SSN. Imprimamos el valor de este atributo para el objeto 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)

Producción :

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

Observe que el atributo _Person__SSN tiene el mismo valor que __SSN. El atributo __SSN se almacena como _Person__SSN en el programa. Siempre que accedemos al atributo __SSN, el programa se encuentra con una excepción AttributeError.

En Python, cuando definimos un atributo usando doble guión bajo (__), el programa agrega _className antes del nombre del atributo. Este proceso se llama mutilación.

Python percibe que los atributos nombrados usando guiones bajos dobles son variables privadas en mangling. Sin embargo, esto no es cierto ya que podemos acceder a las variables usando la sintaxis _className__attributeName.

Conclusión de las variables privadas de Python

En este artículo, discutimos las variables privadas en Python. Hemos visto que no tenemos ninguna palabra clave específica para declarar una variable privada en Python, a diferencia de otros lenguajes de programación. Sin embargo, podemos simular la implementación de variables privadas nombrando las variables usando un carácter de subrayado doble.

También discutimos dos formas de acceder a variables privadas en Python. Sugerimos usar métodos para acceder a variables privadas. Usar el enfoque con el nombre de la clase destruirá la esencia de implementar variables privadas, ya que accederemos a la variable directamente. El programa te da la advertencia de acceder a las variables privadas usando el _className antes del nombre del atributo.

Autor: 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

Artículo relacionado - Python Variable