| |||
get y set Nuevamente con mis dudas, me estanque un poquito en este tema, a lo que entendi, estas palabras se usan, mas que nada, en las clases o procedimientos para ocultar al usuario los metodos que se usan para obtener y modificar los datos, es correcto??? que diferencia hay entre estos dos??? y que diferencia habria entre usar estos comandos y usar una funcion privada (def __ejemplo). A mi entender, mediante estos nombres se puede acceder a los metodos, pero no modificarlos, que en si, las funciones con def tampoco pueden modificarse o si??? me enrrede en este punto, espero me aclaren estas dudas. Gracias de antemano. Saludos. |
| |||
Respuesta: get y set Fijate en este ejemplo simple en Java
Código:
O sea: le quitás al "usuario" del método la posibilidad de "tocar" el valor del atributo directamente.private int numero; public int getNumero() { return numero; } public void setNumero(int nuevoNumero) { this.numero = nuevoNumero; } Si quiero obtener el valor de numero, no tengo más remedio que usar el método getNumero(), y el valor solamente lo puedo cambiar usando setNumero() En python no se hace igual, sino que siempre se accede al atributo con su nombre, y dentro de la clase se asignan las funciones que se encargarán de "controlar" el acceso. Fijate en este ejemplo que encontré en esta página, y comparalo con el de arriba:
Código:
La diferencia principal es que luego yo voy a hacer:class Contacto(object): def set_email(self, value): if '@' not in value: raise Exception("Esto no parece ser una dirección de correo") self._email = value def get_email(self): return self._email email = property(get_email, set_email)
Código:
como si estuviera asignando directamente, pero en realidad se llamará a la función set_email con el parámetro "[email protected]".contacto = Contacto(); contacto.email = "[email protected]" Espero que quede claro, para terminar creo que es importante mencionar que los nombres son completamente arbitrarios, solamente una convención. Saludos. |
| |||
Respuesta: get y set Diran que molesto mucho, pero disculpenme en serio, me interesa aprender de verdad. Entendi que con el set se obtienen los valores del procedimiento que invoco a la clase, se procesa, y se llevan a cabo procedimientos dentro del mismo set, mientras que get devuelve el resultado despues de ser procesado por el set, esta bien lo que entendi??? diran que noefito soy, pero que diferencia hay entre usarlos y no usarlos??? suponiendo dos clases: Cita: ------------------------------------------------------------class suma (object): def numero (a, b): c = a + b return c Cita: class suma (object): def set_numero (self, a, b): c = a + b def get_numero (self): return c Que diferencia habria entre estas dos clases, cuando las dos hacen lo mismo, sumar dos numeros (suponiendo que haya escrito bien las clases). En serio mil disculpas por las molestia que doy, no conozco a nadie que sepa de python por eso recurro a ustedes. Gracias. Saludos. |
| ||||
Respuesta: get y set No, en este caso lo que haces es un "método" de la clase no una "propiedad". Lo que hacemos con get y set es ocultar las propiedades al usuario para que no pueda accederse a ella directamente (Principio de Ocultación POO).
__________________ Por favor, antes de preguntar, revisa la Guía para realizar preguntas. |
| |||
Respuesta: get y set Retomando el ejemplo de alvlin, si yo le quitara el get y set y pusiera esos dos en un solo def email, que diferencia habria??? Igual y los estoy confundiendo porque yo estoy un poco confundido, set si es una palabra reservada de python, pero get tengo entendido que no, entonces, por ende, el procedimiento con set hace su funcion, pero el procedimiento con get, si le cambiaramos la palabra, haria lo mismo???? Espero haya quedado un poco mas claro mi duda, las respuesta que me han dado si me han ayudado muchisimo, aclarandome que son propiedades y no metodos. Gracias. Última edición por betopm; 28/08/2008 a las 12:17 |
| |||
Respuesta: get y set Como no podés acceder al valor "real" (dado que lo estás ocultando, tal y como mencionó David), hacés un método para darle el valor, y otro para obtenerlo. tan simple como eso. set recibe el nuevo valor y lo asigna, si tiene que hacer algún cálculo lo hace. get toma el valor actual y lo devuelve. No tienen por qué usarse en secuencia, simplemente cuando necesites el valor en vez de usar variable = objeto.atributo usás variable = objeto.getAtributo() y cuando necesitás que "atributo" cambie, usás el set. Saludos. |
| |||
Respuesta: get y set Ya entendi, cuando necesito el valor de la propiedad lo obtengo con el get, cuando quiero que cambie lo hago con set, siempre y cuando ya haya declarado que las propiedades van a corresponder a un determinado objeto: email property (set_email, get_email) Get y set son la manera de trabajar con propiedades, sin ellos no se pueden manejar propiedades, porque estas deben de estar ocultas al usuario para evitar modificaciones. Gracias a todos por haberme ayudado. Se los agradezco muchisimo. Saludos. |
| |||
Respuesta: get y set Correcto, excepto por un detalle: no se hacen para evitar modificaciones, sino para evitar modificaciones no controladas. Siguiendo el ejemplo del email que pegué antes, seguramente querrás que una variable que guarde un correo electrónico contenga al menos una @, y si no lo contiene que el valor no se guarde. Si dejás que el usuario (usuario del método, quiero decir) acceda directamente al atributo, no tenés control sobre el valor que pueda contener. Ese es el motivo del "set". El motivo del "get" es permitirte enviar solamente la parte que te interesa del valor del atributo. Por ejemplo, suponiendo que tengas un atributo "fecha": fecha = "28/08/2008" podrías tener un método getFecha() que te devolviera algo como: "Jueves 26 de Agosto de 2008" que no es el valor real de fecha, pero probablemente sea el valor que te interesa. Repito que los nombres son totalmente arbitrarios, si en vez de "getFecha" quiero que el método se llame "soyAlvlin()", funcionará de la misma forma (aunque no será muy intuitivo para leer el código ). A propósito, en mi primer mensaje hice mención a una página cuyo enlace me olvidé de pegar, es ésta: http://tomayko.com/writings/getters-setters-fuxors Saludos. |