Python-Miembros públicos, Protegidos y privados
Los lenguajes clásicos orientados a objetos, como C++ y Java, controlan el acceso a los recursos de clase por palabras clave públicas, privadas y protegidas. A los miembros privados de la clase se les niega el acceso desde el entorno fuera de la clase. Solo se pueden manejar desde dentro de la clase.
Miembros públicos
Los miembros públicos (generalmente métodos declarados en una clase) son accesibles desde fuera de la clase. El objeto de la misma clase es necesario para invocar un método público. Esta disposición de variables de instancia privadas y métodos públicos garantiza el principio de encapsulación de datos.
Todos los miembros de una clase Python son públicos de forma predeterminada. Se puede acceder a cualquier miembro desde fuera del entorno de clase.
Copiar
class Student: schoolName = 'XYZ School' # class attribute def __init__(self, name, age): self.name=name # instance attribute self.age=age # instance attribute
Usted puede tener acceso a la etiqueta Student
de la clase atributos y también modificar sus valores, como se muestra a continuación.
Copiar
>>> std = Student("Steve", 25)>>> std.schoolName'XYZ School'>>> std.name'Steve'>>> std.age = 20>>> std.age25
Miembros protegidos
Los miembros protegidos de una clase son accesibles desde dentro de la clase y también están disponibles para sus subclases. No se permite el acceso a ningún otro entorno. Esto permite que recursos específicos de la clase padre sean heredados por la clase hija.
La convención de Python para proteger una variable de instancia es agregarle un prefijo _ (subrayado único). Esto evita efectivamente que se acceda a él a menos que sea desde una subclase.
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
De hecho, esto no impide que las variables de instancia accedan o modifiquen la instancia. Aún puede realizar las siguientes operaciones:
Copiar
>>> std = Student("Swati", 25)>>> std._name'Swati'>>> std._name = 'Dipa'>>> std._name'Dipa'
Sin embargo, puede definir una propiedad utilizando el decorador de propiedades y hacerla protegida, como se muestra a continuación.
Copiar
class Student:def __init__(self,name):self._name = name@propertydef name(self):return [email protected] name(self,newname):self._name = newname
Arriba, el decorador @property se utiliza para hacer que el método name()
como propiedad y @name.setter
decorador a otro sobrecargas del como método de establecimiento de propiedades. Ahora, _name
está protegido.
Copiar
>>> std = Student("Swati")>>> std.name'Swati'>>> std.name = 'Dipa'>>> std.name'Dipa'>>> std._name # still accessible
Arriba, utilizamos la etiqueta std.name
propiedad para modificar _name
atributo. Sin embargo, todavía es accesible en Python. Por lo tanto, el programador responsable se abstendría de acceder y modificar variables de instancia con el prefijo _
desde fuera de su clase.
Miembros privados
Python no tiene ningún mecanismo que restrinja efectivamente el acceso a ninguna variable de instancia o método. Python prescribe una convención de prefijar el nombre de la variable / método con un guion bajo simple o doble para emular el comportamiento de los especificadores de acceso protegido y privado.
El doble guion bajo __
prefijado a una variable la convierte en privada. Da una fuerte sugerencia de no tocarlo desde fuera de la clase. Cualquier intento de hacerlo resultará en un AttributeError:
Copiar
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.')
Copiar
>>> 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 realiza el nombre de destrozarlo de variables privadas. Cada miembro con un doble guion bajo se cambiará a _object._class__variable
. Así, todavía se puede acceder desde fuera de la clase, pero en la práctica debe ser evitado.
Copy
>>> std = Student("Bill", 25)>>> std._Student__name'Bill'>>> std._Student__name = 'Steve'>>> std._Student__name'Steve'>>> std._Student__display()'This is private method.'
Por lo tanto, Python proporciona implementación conceptual de modificadores de acceso público, protegido y privado, pero no como otros lenguajes como C#, Java, C++.
Leave a Reply