Foros del Web » Programando para Internet » Python »

get y set

Estas en el tema de get y set en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 27/08/2008, 08:11
 
Fecha de Ingreso: agosto-2008
Mensajes: 96
Antigüedad: 15 años, 8 meses
Puntos: 0
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.
  #2 (permalink)  
Antiguo 28/08/2008, 11:11
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: get y set

Fijate en este ejemplo simple en Java

Código:
private int numero;

public int getNumero() {
    return numero;
}

public void setNumero(int nuevoNumero) {
    this.numero = nuevoNumero;
}
O sea: le quitás al "usuario" del método la posibilidad de "tocar" el valor del atributo directamente.
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:
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)
La diferencia principal es que luego yo voy a hacer:

Código:
contacto = Contacto();
contacto.email = "[email protected]"
como si estuviera asignando directamente, pero en realidad se llamará a la función set_email con el parámetro "[email protected]".

Espero que quede claro, para terminar creo que es importante mencionar que los nombres son completamente arbitrarios, solamente una convención.


Saludos.
  #3 (permalink)  
Antiguo 28/08/2008, 11:48
 
Fecha de Ingreso: agosto-2008
Mensajes: 96
Antigüedad: 15 años, 8 meses
Puntos: 0
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.
  #4 (permalink)  
Antiguo 28/08/2008, 11:55
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Exclamación 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.
  #5 (permalink)  
Antiguo 28/08/2008, 11:58
 
Fecha de Ingreso: agosto-2008
Mensajes: 96
Antigüedad: 15 años, 8 meses
Puntos: 0
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
  #6 (permalink)  
Antiguo 28/08/2008, 12:04
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
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.
  #7 (permalink)  
Antiguo 28/08/2008, 13:05
 
Fecha de Ingreso: agosto-2008
Mensajes: 96
Antigüedad: 15 años, 8 meses
Puntos: 0
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.
  #8 (permalink)  
Antiguo 28/08/2008, 13:39
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
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.
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 00:32.