Variables privadas en Python
- ¿Qué es una variable privada en Python?
- ¿Cómo implementar una variable privada en Python?
- Acceder a variables privadas en Python
- Conclusión de las variables privadas de Python
![Variables privadas en Python](/img/Python/feature-image---python-private-variables.webp)
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.
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