Foros del Web » Programando para Internet » Python »

Tratando de entender algunos "overrides" de métodos en Django

Estas en el tema de Tratando de entender algunos "overrides" de métodos en Django en el foro de Python en Foros del Web. Hola todos, estoy leyendo un libro sobre django que se llama Two Scoops of Django. Me parece un poco avanzado y no termino de comprender ...
  #1 (permalink)  
Antiguo 26/03/2014, 19:19
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 8 años, 9 meses
Puntos: 2
Tratando de entender algunos "overrides" de métodos en Django

Hola todos, estoy leyendo un libro sobre django que se llama Two Scoops of Django. Me parece un poco avanzado y no termino de comprender el uso de "super" para reemplazar métodos en clases. Supongamos este ejemplo que da el libro:
Código:
from django.views.generic import ListView
from .models import Flavor

class FlavorListView(ListView):
      model = Flavor
      
      def get_queryset(self):
            queryset = super(FlavorListView, self).get_queryset()
            
            q = self.request.GET.get("q")
            if q:
                 return queryset.filter(title__icontains=q)
Entonces, el modelo Flavor ya lo había creado antes el autor, q es el queryset que pasa del form a la view y bueno ListView es una de las views genéricas de Django.
Lo que no entiendo es más de Python:
como es que el método get_queryset se llama a sí mismo en la primera línea:
Código:
queryset = super(FlavorListView, self).get_queryset()
¿Cómo funciona eso? si el método get_queryset debe llamar en seguida a si mismo para establecer la variable queryset, ¿en qué momento se resuelve el método get_queryset?.

Lo que está haciendo aquí el autor es mostrando como se puede "override" el método get_queryset de la vista genérica ListView. Pero no logro comprender la lógica.

Si ustedes comprenden, les agradecería si me pueden explicar.

Última edición por stormearth; 26/03/2014 a las 19:22 Razón: ortografía
  #2 (permalink)  
Antiguo 26/03/2014, 19:47
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 14 años, 4 meses
Puntos: 1329
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Entonces necesitas leer de Python no de Django:

http://www.niwi.be/2011/06/09/herenc...per-en-python/


Saludos:adiios:
__________________
Grupo Telegram Docker en Español
  #3 (permalink)  
Antiguo 27/03/2014, 15:56
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 8 años, 9 meses
Puntos: 2
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Que tal Carlangueitor ya lei el articulo. Es un buen articulo pero no me explica justamente lo que estaba preguntando, el articulo explica bien que ocurre con las herencias multiples de distintas clases. Lo que yo pregunte es sobre como funciona cuando a la clase se le hereda a si misma.
  #4 (permalink)  
Antiguo 27/03/2014, 16:20
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 14 años, 4 meses
Puntos: 1329
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

La clase no se hereda a si misma, no sé de donde sacas eso.

Saludos
__________________
Grupo Telegram Docker en Español
  #5 (permalink)  
Antiguo 02/04/2014, 10:57
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 8 años, 9 meses
Puntos: 2
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Tienes razón, a lo que me refería es a cuando la un método de la clase se ejecuta a sí mismo. :P ?¿
  #6 (permalink)  
Antiguo 02/04/2014, 11:04
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 14 años, 4 meses
Puntos: 1329
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

¿He?

No se ejecuta a si mismo, super ejecuta el método de la clase padre.

Saludos
__________________
Grupo Telegram Docker en Español
  #7 (permalink)  
Antiguo 08/04/2014, 18:41
Avatar de stormearth  
Fecha de Ingreso: octubre-2013
Ubicación: Quito
Mensajes: 68
Antigüedad: 8 años, 9 meses
Puntos: 2
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Claro, pero la el método de la clase padre que ejecuta es el método mismo.
O sea

class ..
def metodo_x:
super metodo_x

El metodo_x ejecuta, a través de super, al mismo método x. Me podrías ayudar a entender eso?
  #8 (permalink)  
Antiguo 09/04/2014, 10:25
Avatar de Carlangueitor
Moderador ლ(ಠ益ಠლ)
 
Fecha de Ingreso: marzo-2008
Ubicación: México
Mensajes: 10.037
Antigüedad: 14 años, 4 meses
Puntos: 1329
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Vuelve a ver el link que te pasé especificamente este código:

Código Python:
Ver original
  1. # -*- coding: utf8 -*-
  2.  
  3. class A(object):
  4.  
  5.     def __init__(self):
  6.         print "A"
  7.         super(A, self).__init__()
  8.  
  9. class B(A):
  10.     def __init__(self):
  11.         print "B"
  12.         super(B, self).__init__()
  13.  
  14. print "__mro__:", [x.__name__ for x in B.__mro__]
  15. instance = B()

Y analiza lo que imprime.


Saludos
__________________
Grupo Telegram Docker en Español
  #9 (permalink)  
Antiguo 21/04/2014, 13:09
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 15 años, 4 meses
Puntos: 292
Respuesta: Tratando de entender algunos "overrides" de métodos en Django

Lo que creo confunde de Python son las redundancias (o supuestas en este caso)... tanto metodo(self,...) y en este caso en particular super(clase_padre, self)

@stormearth : lo que estas haciendo es heredar todo... sobreescribir ese metodo get_queryset() y llamar desde dentro al metodo de la clase padre con super(clase_padre, self)

En otros lenguajes seria solo:

Cita:
super.metodo(parametros)
pero en Python 2.x es

Cita:
super(clase_padre, self).metodo()

PREGUNTA:

- ¿ Por qué super(clase_padre, self).metodo() y no super(self).metodo() o self() a secas ?

RESPUESTA:

- Como sea!! en Python 3... se puede usar asi: super() sin mas parametros


OBSERVACION: no pienses a self() como una funcion sino como un "statement" .. como "this" o "self" ...etc en otros lenguajes.... el hecho de que lleve parametros solo es una construccion (creeria yo)

(los parametros los extrae del contexto "self")
__________________
Salu2!

Última edición por Italico76; 22/04/2014 a las 08:12

Etiquetas: django, super
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:45.