Foros del Web » Programando para Internet » Python »

cual es mi error -POO-

Estas en el tema de cual es mi error -POO- en el foro de Python en Foros del Web. Hola a todos, estube practicando algo de POO en python y bueno descubri que las variables privadas no existen y el encapsulamiento no es un ...
  #1 (permalink)  
Antiguo 04/03/2009, 13:42
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
cual es mi error -POO-

Hola a todos, estube practicando algo de POO en python y bueno descubri que las variables privadas no existen y el encapsulamiento no es un 99% eficaz.
Bueno saliendo de ese tema, diseñe un ejemplito para practicar y bueno me sale un error; espero que sea error mio y no del lenguaje Python.
Cree 2 Clases y una interface estan en archivos distintos; el problema creo yo, es cuando trato de asignar el valor 18 a maxedad de la clase "PuertaDisco"; se supone que una clase debe poseer atributos y metodos; entonces en el metodo "e_asegurar" trato de comparar la edad del cliente (La cual asigno yo cuando ejecuto el programa) con el maximo de edad que se asigno para que ingrese (esto lo asigno internamente).

Código python:
Ver original
  1. ---------interface.py------------
  2.  
  3.  
  4. import claseCliente
  5. import clasePuerta
  6.  
  7. nom=raw_input("ingrese su nombre: ")
  8. eda=raw_input("ingrese su edad: ")
  9. clie = claseCliente.cliente(nom,eda)
  10. clie.e_irdisco()
  11.  
  12. ---------ClaseCliente.py--------
  13.  
  14. import ClasePuerta
  15.  
  16. class cliente:
  17.     def __init__(self,pnomb,pedad):
  18.         self.pnomb=pnomb
  19.         self.pedad=pedad
  20.     def e_irdisco(self):
  21.         op=raw_input("Desea ir a Disco? :")
  22.         if op=="si":
  23.             ClasePuerta.e_asegurar()
  24.  
  25.  
  26. ---------ClasePuerta.py-----------
  27.  
  28. import ClaseCliente
  29.  
  30. class PuertaDisco:
  31.     def __init__(self,maxedad):
  32.         self.maxedad=maxedad
  33.     def e_asegurar(self):
  34.         self.maxedad=18
  35.         if self.maxedad > int(claseCliente.pedad)
  36.             print "NO PUEDE PASAR"
  37.         else:
  38.             print "ADELANTE PASE"

Última edición por AlvaroG; 05/03/2009 a las 11:10 Razón: resaltado de sintaxis
  #2 (permalink)  
Antiguo 04/03/2009, 15:29
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: cual es mi error -POO-

Tienes varios errores, por ejemplo, en la línea 35 te faltan los dos puntos, además, tomas a claseCliente como si fuera una clase, cuando no lo es, la clase se llama "cliente" y debe instanciarse para que puedas utilizarla.

Lo mismo ocurre en la línea 23, ClasePuerta no es una clase, la clase es PuertaDisco, y para usarla debes crear una instancia de ella.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 05/03/2009, 06:07
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: cual es mi error -POO-

Cita:
Iniciado por yuo2 Ver Mensaje
Hola a todos, estube practicando algo de POO en python y bueno descubri que las variables privadas no existen y el encapsulamiento no es un 99% eficaz.
¡Ojo! que no puedas poner un atributo como "private" no quiere decir que no haya un encapsulamiento eficaz.
Fijate en este tema http://www.forosdelweb.com/f130/get-set-618901/
y esta página http://www.diveintopython.org/object...functions.html

Básicamente, si el nombre de un miembro comienza con __ (dos guiones bajos), es un miembro privado.


Saludos.
  #4 (permalink)  
Antiguo 05/03/2009, 10:38
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
Busqueda Respuesta: cual es mi error -POO-

Bueno habia errores (como dijeron arriba en los dos puntos del if y al llamar las clases no estaban escritos bien), estan corregidos

Ahora el problema radica para llamar al evento o metodo 'e_asegurar' de la ClasePuerta desde la ClaseCliente pues me da error. Nose si es porque le asigno el valor self.maxedad=18; ya que ese valor lo deseo asignar directamente desde el codigo.

Código Codigo Corregido:
Ver original
  1. ### interface.py ####
  2.  
  3. import ClaseCliente
  4. import ClasePuerta
  5.  
  6. nom=raw_input("ingrese su nombre: ")
  7. eda=raw_input("ingrese su edad: ")
  8. clie = ClaseCliente.cliente(nom,eda)
  9. clie.e_irdisco()
  10.  
  11. ### ClaseCliente.py ####
  12.  
  13. import ClasePuerta
  14. class cliente:
  15.     def __init__(self,pnomb,pedad):
  16.         self.pnomb=pnomb
  17.         self.pedad=pedad
  18.     def e_irdisco(self):
  19.         op=raw_input("Desea ir a Disco?: ")
  20.         if op=="si":
  21.             ClasePuerta.e_asegurar()
  22.  
  23. ### ClasePuerta.py ###
  24.  
  25. import ClaseCliente
  26.  
  27. class PuertaDisco:
  28.     def __init__(self,maxedad):
  29.         self.maxedad=maxedad
  30.     def e_asegurar(self):
  31.         self.maxedad=18
  32.         if self.maxedad>int(ClaseCliente.pedad):
  33.             print "NO PUEDE PASAR"
  34.         else:
  35.             print "ADELANTE PASE"

imagen del error:
img204.imageshack.us/img204/6706/imgm.jpg

Alvino sobre los get, set ; en realidad no me terminan de convenser ya que cuando inicio la clase con __init__(self,__edad,__nombre) y aplico los get y set + property; igual a la hora de programar en codigo los muestra; por lo cual no oculta esos atributos por otros nombres; no es igual que el VisualStudio (renegando) que remplaza mis atributos por nombres que le puedo dar. Bueno ahora es Python asi que aprobechar lo que se pueda :D

Igual voy a revisarlo bien eso de los set,get.. recien leo los mensajes.

Última edición por yuo2; 05/03/2009 a las 11:06
  #5 (permalink)  
Antiguo 05/03/2009, 10:50
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: cual es mi error -POO-

Cita:
Iniciado por David el Grande Ver Mensaje
Tomas a claseCliente como si fuera una clase, cuando no lo es, la clase se llama "cliente" y debe instanciarse para que puedas utilizarla.

Lo mismo ocurre en la línea 23, clasePuerta no es una clase, la clase es PuertaDisco, y para usarla debes crear una instancia de ella.
Eso todavía no corregiste, ojo con eso, claseCliente y clasePuerta son módulos, no son clases. Así que poner clasePuerta.e_asegurar, ya que el módulo clasePuerta no tiene ningún método llamado así, quien tiene ese método es la clase PuertaDisco que está dentro del módulo, ¿entiendes a lo que me refiero?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #6 (permalink)  
Antiguo 05/03/2009, 11:19
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: cual es mi error -POO-

Cita:
Iniciado por David el Grande Ver Mensaje
Eso todavía no corregiste, ojo con eso, claseCliente y clasePuerta son módulos, no son clases. Así que poner clasePuerta.e_asegurar, ya que el módulo clasePuerta no tiene ningún método llamado así, quien tiene ese método es la clase PuertaDisco que está dentro del módulo, ¿entiendes a lo que me refiero?
Entonces como tendria que llamar a ese metodo 'e_asegurar'?
asi?
Código codigo:
Ver original
  1. ClasePuerta.PuertaDisco.e_asegurar()
ya lo intente y naa.. O,o
  #7 (permalink)  
Antiguo 05/03/2009, 11:22
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: cual es mi error -POO-

No, debes instanciar un objeto a partir de la clase PuertaDisco.
Código python:
Ver original
  1. obj = ClasePuerta.PuertaDisco(15)
  2. obj.e_asegurar()
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 05/03/2009, 11:34
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: cual es mi error -POO-

Cita:
Iniciado por David el Grande Ver Mensaje
No, debes instanciar un objeto a partir de la clase PuertaDisco.
Código python:
Ver original
  1. obj = ClasePuerta.PuertaDisco(15)
  2. obj.e_asegurar()
Uhmm bueno en realidad queria que el valor de 15 se ejecutara en ese mismo evento de e_asegurar de la ClasePuerta.
Bueno siguiendo tu sugerencia ahora como haria yo para poder evaluar ese valor con la edad de mi cliente?
justo en esta linea de programacion del evento e_asegurar, tendria que hacer este cambio; pero al parecer no logro comparar:

Código Codigo ClasePuerta:
Ver original
  1. if ClaseCliente.pedad < self.maxedad:
  2.             print "NO PUEDE PASAR"
  3.         else:
  4.             print "ADELANTE PASE"
  #9 (permalink)  
Antiguo 05/03/2009, 11:37
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: cual es mi error -POO-

ClaseCliente tampoco es una clase, es un módulo.

Por lo que tampoco posee un método o atributo con nombre "pedad", deberías recibir como parámetro en la función e_asegurar un objeto cliente o la edad con la cual comparar para evitar instanciar una nueva clase cliente (no tendría sentido en este contexto).
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 05/03/2009, 11:40
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: cual es mi error -POO-

Cita:
Iniciado por David el Grande Ver Mensaje
ClaseCliente tampoco es una clase, es un módulo.

Por lo que tampoco posee un método o atributo con nombre "pedad", deberías recibir como parámetro en la función e_asegurar un objeto cliente o la edad con la cual comparar para evitar instanciar una nueva clase cliente (no tendría sentido en este contexto).
Y si jalo mi variable eda de la interface para comparalo??.. tampoco parece compararlo :p .
Como podria enviar el parametro
  #11 (permalink)  
Antiguo 05/03/2009, 11:50
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: cual es mi error -POO-

En este caso eres tú quien no está encapsulando las clases correctamente, las clases no deberían tomar variables "de la interface" o directamente de otra clase.

Debes tomar por un parámetro lo que necesites para trabajar.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #12 (permalink)  
Antiguo 06/03/2009, 11:53
 
Fecha de Ingreso: diciembre-2008
Ubicación: PERU
Mensajes: 294
Antigüedad: 15 años, 4 meses
Puntos: 23
Respuesta: cual es mi error -POO-

Bueno gente ya termine el codigo ya lo hice funcionar, aqui se los dejo para q lo tengan de ejemplito:

Código CODIGO TERMINADO:
Ver original
  1. ////interface.py////
  2.  
  3. import claseCliente
  4. import clasePuerta
  5.  
  6. nom=raw_input("ingrese su nombre: ")
  7. eda=raw_input("ingrese su edad: ")
  8. clien=claseCliente.cliente(nom,eda)
  9. clien.e_irdisco()
  10.  
  11. ////claseCliente.py////
  12.  
  13. import clasePuerta
  14. class cliente:
  15.     def __init__(self,pnomb,pedad):
  16.         self.pnomb=pnomb
  17.         self.pedad=pedad
  18.     def e_irdisco(self):
  19.         op=raw_input("Desea ir a Disco?: ")    
  20.         if op=="si":
  21.             obj=clasePuerta.PuertaDisco(self.pedad)
  22.             obj.e_asegurar()
  23.  
  24. //// clasePuerta.py ////
  25.  
  26. class PuertaDisco:
  27.     def __init__(self,maxedad):
  28.         self.maxedad=maxedad
  29.     def e_asegurar(self):      
  30.         if int(self.maxedad) < 18 :
  31.             print "NO PUEDE PASAR"
  32.         else:
  33.             print "ADELANTE PASE"
Y gracias a los que se tomaron el tiempo de ayudar: David el Grande y alvlin
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 07:20.