Foros del Web » Programando para Internet » Python »

no entiendo nada :@

Estas en el tema de no entiendo nada :@ en el foro de Python en Foros del Web. hola, vengo leyendo el curso de pythonya... y ahora llege a la programación orientada a objetos... y no entiendo nada... llege a entender q hay ...
  #1 (permalink)  
Antiguo 03/06/2012, 10:13
Avatar de iivo94  
Fecha de Ingreso: febrero-2011
Ubicación: Argentina
Mensajes: 281
Antigüedad: 8 años, 5 meses
Puntos: 3
no entiendo nada :@

hola, vengo leyendo el curso de pythonya... y ahora llege a la programación orientada a objetos...
y no entiendo nada...
llege a entender q hay clases, adentro de las clases se definen metodos q son funciones y atributos q son variables.. no entiendo porque se pone self, no entiendo q es self. no entiendo nada...

alguien me puede explicar porfavor?
  #2 (permalink)  
Antiguo 03/06/2012, 12:12
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 14 años, 4 meses
Puntos: 1360
Respuesta: no entiendo nada :@

Esta escribiendo una respuesta demasiado larga para llegar al punto de tu pregunta.

self (o cualquier otro nombre que le quieras dar), es una referencia a la misma instancia de la clase.

Vamos a ver un ejemplo:
Supón que tienes la siguiente clase Perro (Dog), tienes un constructor que recibe un nombre (name) y un método ladra (bark) que no recibe ningún parámetro.
Código Python:
Ver original
  1. class Dog:
  2.     def __init__(self, name):
  3.         self.name = name
  4.  
  5.     def bark(self):
  6.         return "%s: woof woof" % (self.name,)


Ahora hacemos uso de la clase Dog
Código Python:
Ver original
  1. alpha_dog = Dog("fido")
  2. beta_dog = Dog("rufu")
  3. print fido.bark()
  4. print rufu.bark()

Como puedes ver la clase Dog es como una plantilla para las instancias. Pero como puede diferenciar python (u otros lenguajes) sobre que instancia esta trabajando? Esto es fácil cuando se mantiene una referencia en este caso self.
  #3 (permalink)  
Antiguo 08/06/2012, 09:47
Avatar de Celcius  
Fecha de Ingreso: febrero-2003
Ubicación: Lima - Perú
Mensajes: 652
Antigüedad: 16 años, 5 meses
Puntos: 5
Respuesta: no entiendo nada :@

Me parece que este es un tema de "entender" la programación orientada a objetos. Si le pides a Google que traduzca la palabra "Self" te dará como resultado: "Yo". Cuando en Python se instancia (se crea) un objeto (a partir de una clase) y luego ves dentro de la clase la palabra "self" se está haciendo referencia al mismo objeto creado y algún método de la clase instanciada.

Para el caso de los ejemplos de razpeitia la clase es Dog, tiene dos métodos (la clase) y luego INSTANCIA la clase y crea dos objetos (alpha_dog y beta_dog, cada uno con su respectivo nombre - fido y rufu)... luego los manda a "ladrar" ya que ambos objetos fueron instanciados de la misma clase (y esta clase tiene el método bark), SELF permite que ambos objetos (por separado) puedan ladrar. Ojala lo entiendas y no te confunda mas.

Repito, pienso que es un tema de entender la programacion orientada a objetos (básico) así es que te recomiendo revises algún tutorial de ese tema. Un saludo y sigamos aprendiendo Python (tengo unas semanas y me fascina)
__________________
"Si tú conocieras el don de Dios, y quién es el que te dice: 'Dame de beber,' tú Le habrías pedido a El, y El te hubiera dado agua viva.
Sn. Juan 4:19
Jesus
  #4 (permalink)  
Antiguo 09/06/2012, 07:45
 
Fecha de Ingreso: mayo-2012
Ubicación: Vigo, Galicia
Mensajes: 9
Antigüedad: 7 años, 2 meses
Puntos: 2
Respuesta: no entiendo nada :@

Bueno yo tenia el mismo problema que tu hace tiempo, es dificil entender la POO.
Aqui te explico de forma facil de entender un ejemplo, no es del todo correcto pero espero que te ayude.
Código:
class Coche:
   def inicializar(self, gasolina):
        self.gasolina = gasolina
Aqui estrenamos la clase Coche, y creamos inicializar (por protocolo seria __init__ pero a mi no me gusta :P) con self (se pone en todos) y gasolina (valor que utilizaremos). lo de self.gasolina = gasolina hace referencia a gasolina.

Código:
    def arrancar(self, gasolina):
        if gasolina == 0:
            print "Sin gasolina"
            print "El coche no arranca"
        else:
            print "Deposito lleno"
            print "Arranca"
Con esto comprobamos si el coche puede arrancar. Si el nivel de gasolina es 0, no arranca, si no, arranca. Bien, nuestra clase está hecha. Pero, ¿De qué vale? Si ejecutas esto no saldra nada. Fuera de la clase, damos un nombre a esta clase. por ejemplo:
Código:
elcochecitolere = Coche()
a partir de ahora para refirirnos a la clase usamos elcochecitolere.
Podemos acceder a los métodos de la clase, por ejemplo si queremos que el coche tenga el nivel de gasolina en 1 hariamos:
Código:
elcochecitolere.inicializar(1)
elcochecitolere.arrancar(1)
El código completo sería así:
Código:
print "Intentando arrancar el coche..."


class Coche:

    def inicializar(self, gasolina):
        self.gasolina = gasolina

    def arrancar(self, gasolina):
        if gasolina == 0:
            print "Sin gasolina"
            print "El coche no arranca"
        else:
            print "Deposito lleno"
            print "Arranca"

elcochecitolere = Coche()
elcochecitolere.inicializar(1)
elcochecitolere.arrancar(1)
Y la respuesta del terminal (en linux) sería:

Código:
Intentando arrancar el coche...
Deposito lleno
Arranca
Posiblemente tenga algún fallo en mi explicación, pero intenté exponerlo sin tanta terminología porque yo también estoy aprendiendo, y con todas esas palabrajas al principio cuesta. Espero haber ayudado :3
  #5 (permalink)  
Antiguo 21/06/2012, 00:48
 
Fecha de Ingreso: junio-2012
Mensajes: 18
Antigüedad: 7 años, 1 mes
Puntos: 2
Respuesta: no entiendo nada :@

Xacobe, permíteme hacer algunos comentarios sobre tu respuesta.

Cita:
Aqui estrenamos la clase Coche, y creamos inicializar (por protocolo seria __init__ pero a mi no me gusta :P) con self (se pone en todos) y gasolina (valor que utilizaremos). lo de self.gasolina = gasolina hace referencia a gasolina.
__init__ es una función que se ejecuta "luego" de creado el objeto y permite, como lo dice el nombre, inicializar el objeto. Es preferible te acostumbres a usarlo ya que es la forma más "común" de hacerlo y permite, al momento de la creación, pasar los parámetros necesarios para que durante la inicialización, tu objeto quede cargado correctamente sin necesidad de estar llamando a una función luego de la creación. Es importante destacar que __init__ no es el "constructor de la clase" ya que cuando se ejecuta, el objeto ya fue creado.

Respecto a la función de "arrancar", no es necesario pasarle por parámetro "gasolina" ya que para eso deberías acceder a la "gasolina del coche" es decir: self.gasolina.

Cita:
Con esto comprobamos si el coche puede arrancar. Si el nivel de gasolina es 0, no arranca, si no, arranca. Bien, nuestra clase está hecha. Pero, ¿De qué vale? Si ejecutas esto no saldra nada. Fuera de la clase, damos un nombre a esta clase. por ejemplo:
Lo que haces no es darle un "nombre a la clase" sino crear un "objeto instancia de dicha clase cuyo nombre es elcochecitolere"

Cita:
a partir de ahora para refirirnos a la clase usamos elcochecitolere.
No sería para referirte a la clase sino para referenciar al objeto instancia de la clase.

El código yo lo dejaría así:
Código Python:
Ver original
  1. class Coche:
  2.     def __init__(self, gasolina):
  3.         self.gasolina = gasolina
  4.  
  5.     def arrancar(self):
  6.         if self.gasolina: #no es necesario pasar gasolina por parámetro, para algo tenemos el atributo gasolina
  7.             print "Con gasolina, arrancando"
  8.         else:
  9.             print "Sin gasolina, imposible arrancar"
  10.  
  11. mi_coche = Coche(20)
  12. mi_coche.arrancar()

Otra comentario es que no es necesario poner if self.gasolina == 0. Python interpreta 0 como valor lógico False y cualquier otro número como valor lógico True.

Saludos!

Etiquetas: gui, nada, 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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:48.