Foros del Web » Programando para Internet » Python »

¿Son imprenscindibles los atributos y metodos privados?

Estas en el tema de ¿Son imprenscindibles los atributos y metodos privados? en el foro de Python en Foros del Web. Hola! Bueno, en referencia de la encapsulacion con Python, por lo que he leido, un guion bajo es una advertencia de no modificar dicho atributo. ...
  #1 (permalink)  
Antiguo 23/02/2016, 12:04
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 11 años, 4 meses
Puntos: 9
¿Son imprenscindibles los atributos y metodos privados?

Hola!

Bueno, en referencia de la encapsulacion con Python, por lo que he leido, un guion bajo es una advertencia de no modificar dicho atributo. Y dos guiones...privados (Aunque como apuntan algunos tutoriales no son privados del todo).

Me refiero si son necesarios crear metodos y atributos privados cuando hacemos programas para nosotros. Es decir, que no los van utilizar terceros. Porque luego esta el lio de los getters, setters y demas. Aunque todavia estoy en pañales con la POO, veo clases muy sencillas inundadas de codigo de este tipo.

Hasta ahora le voy encontrando logica a lo aprendido en la POO. Osea, la herencia, herencia multiple, metodos especiales, sobrecarga operadores y polimorfismo. Pero con la encapsulacion se enreda mucho el codigo. Lo comento por que no me gusta aprender algo que no vaya a utilizar. Prefiero profundizar mas en temas que vaya a darle mas uso.

¿Recomentadais dar un vistazo al tema de la encapsulacion? ¿Es util para programas propios?

Saludos!
  #2 (permalink)  
Antiguo 23/02/2016, 23:31
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 1 mes
Puntos: 1360
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

Cita:
¿Recomentadais dar un vistazo al tema de la encapsulacion?
Si.

Encapsular no es concepto de python, es un concepto de POO, usualmente es subestimado pero es muy útil. De hecho lo usas todo el tiempo y hay veces que no te das cuenta.

Cita:
¿Es util para programas propios?
Depende.

¿Es un proyecto enorme o mediano?
Muy posiblemente si sea muy útil.

Es un script sencillo de menos de 300 lineas? Tal vez ni uses clases.
  #3 (permalink)  
Antiguo 24/02/2016, 07:43
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

El problema de no "esconder" el estado interno de un objeto es que ya no podés asumir nada en sus métodos. Por ejemplo:

Código Python:
Ver original
  1. class Ejemplo(object):
  2.  
  3.     def __init__(self):
  4.         self.estado = "Inicializado"
  5.  
  6.     def devolver_algo_del_estado(self):
  7.         return len(estado)

En un lenguaje como Java, declaras "estado" como "private", y ya te aseguras de que lo anterior no va a fallar en condiciones normales. Sin embargo, en Python, puedo hacer

Código Python:
Ver original
  1. a = Ejemplo()
  2. a.estado = None

y ya no puedo asegurar que el método no falle.

Ahora, establecer getters y setters sin hacer ningún control, solamente porque "los atributos públicos son malos" tampoco soluciona el problema (eso sin considerar que en Python no se usa este tipo de métodos, en vez de eso se usan las "properties", lee sobre eso)

Python no tiene atributos privados. Incluso poner un guión bajo frente al nombre no impide que el atributo se modifique, si acaso nada más lo hace un poco más difícil desde el punto de vista de la sintaxis.
Si todos los programadores fuesen "adultos responsables", se usaría solamente la API exportada por una clase para trabajar con sus objetos, es decir sus métodos y atributos públicos. Los atributos privados existen casi únicamente porque en general no se puede confiar en la responsabilidad de los compañeros de trabajo :D
  #4 (permalink)  
Antiguo 24/02/2016, 12:34
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 11 años, 4 meses
Puntos: 9
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

Cita:
Iniciado por AlvaroG Ver Mensaje

Los atributos privados existen casi únicamente porque en general no se puede confiar en la responsabilidad de los compañeros de trabajo :D
Sí, de los compañeros de trabajo mejor no fiarse

Aunque el proteger un atributo o metodo es relativo:

Código Python:
Ver original
  1. class Prueba:
  2.     def __init__(self):
  3.         self.__protegido = 4

Código Python:
Ver original
  1. >>> obj = Prueba()
  2. >>> obj.__protegido

Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
obj.__protegido
AttributeError: 'Prueba' object has no attribute '__protegido'

Logicamente arroja la excepcion. Pero haciendo:

Código Python:
Ver original
  1. >>> obj._Prueba__protegido
  2. 4

Incluso permite su modificacion:
Código Python:
Ver original
  1. >>> obj._Prueba__protegido = 5
  2. >>> obj._Prueba__protegido
  3. 5

No se, tampoco hay que escribir mucho codigo para variar un atributo privado o protegido...
  #5 (permalink)  
Antiguo 25/02/2016, 07:29
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

Por eso mi último párrafo empieza con "Python no tiene atributos privados", y el comentario que citas era para el caso general de otros lenguajes
  #6 (permalink)  
Antiguo 28/02/2016, 22:19
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 16 años, 1 mes
Puntos: 1360
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

Java tiene reflection, claro que puedes ver los atributos privados y cambiarlos.

Fuentes:
http://stackoverflow.com/a/1555680
http://stackoverflow.com/a/4516608
  #7 (permalink)  
Antiguo 29/02/2016, 07:50
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Son imprenscindibles los atributos y metodos privados?

"en condiciones normales"... no digo que reflection sea algo fuera de lo normal, pero ciertamente no es algo que uno vaya a hacer "sin querer", como podría ser con un atributo en Python.

En cualquier caso, no conozco lo suficiente del Java moderno como para opinar, apenas si estudié lo suficiente de Java 1.4 en 2007 para pasar la certificación

Etiquetas: atributos, metodos, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:35.