2012-04-28 13 views
5

Chicos, estoy teniendo problemas para entender el flujo de control en la clase python, es decir, lo que está sucediendo con el código paso a paso. Dado el siguiente código corto, me gustaría saber: cuando se llama a la clase MainPage, ¿simplemente ejecuta todo lo que está dentro de esa clase? En orden lineal? (La primera línea, después de la segunda, etc.)Problemas para comprender el flujo de control en python class (en un motor de aplicación de google)

enter image description here

+0

http://webpy.org/docs/0.3/tutorial – dm03514

Respuesta

6

Cuando se ejecuta un archivo de Python, cada instrucción en el archivo se ejecuta desde la parte superior a la parte inferior. En su caso, hay seis estados:

from .. 
from .. 
class MainPage .. 
application = .. 
def main() .. 
if __name__ .. 

Los dos primeros se encuentran otros módulos de Python, y ejecutar todas sus declaraciones, que probablemente sólo definen un montón de clases, y luego se definen algunos nombres en el módulo utilizando valores de esos otros módulos. Entonces, después de las dos primeras declaraciones, tenemos webapp y run_wsgi_app definidos.

El tercer enunciado define la clase MainPage. Lo hace ejecutando las instrucciones dentro del cuerpo de la clase, en este caso solo hay una: a def. Tenga en cuenta que la ejecución de una declaración def no ejecuta las instrucciones en el cuerpo de la función, simplemente recopila esas declaraciones en una función nombrada. Cuando termina el cuerpo de la clase, todos los nombres definidos se convierten en atributos de la clase.

La cuarta instrucción llama al webapp.WSGIApplication y asigna el resultado al application.

La quinta declaración define una función llamada main.

La sexta declaración mira el nombre __name__. Cada vez que se ejecuta un archivo Python, se le asigna una variable __name__. Si el archivo es el principal que se está ejecutando, es decir, el que Python comenzó con, el valor de __name__ es "__main__". Esta declaración if es un modismo que significa: "¿Soy el programa principal?" En este caso, lo es, por lo que el cuerpo de la instrucción if también se ejecuta.

El cuerpo de if simplemente llama a la función main(), que a su vez invoca la función run_wsgi_app, pasando su valor application ya incorporado.

Se trata de ejecutar una aplicación WSGI, pero básicamente equivale a "esperar hasta que alguien visite una URL, y luego asignar la URL a algún código y luego ejecutar el código". En su caso, proporcionó un mapa de URL que asociaba "/" con MainPage. Una vez que alguien visita el/URL, se creará un objeto MainPage y se invocará un método en él.

En particular, debido a que el método HTTP utilizado para visitar/se GET, el corredor de la aplicación WSGI llama al método .get() en el objeto MainPage. Las declaraciones en el método get se ejecutan en secuencia, escribiendo algunos datos en la respuesta. Cuando ya no hay más declaraciones en el cuerpo de la función, regresa. ¡El contenedor de la aplicación WSGI envía esa respuesta nuevamente al navegador web!

Este programa nunca finaliza, porque el ejecutante de la aplicación WSGI siempre gira en bucle esperando la siguiente visita a la URL. Pero si no fuera así, una vez completada la última declaración en su archivo principal, el programa de Python estaría listo y el proceso finalizaría.

+0

Gracias por su atención y excelente respuesta, Ned. Me clarificó varios otros aspectos. Pero todavía tengo una duda con respecto a esto: "Una vez que alguien visita el/URL, se creará un objeto MainPage y se invocará un método sobre él". Cuando se crea el objeto MainPage, siempre ejecutará los procedimientos dentro de ese objeto (como get, post, etc.)? – craftApprentice

+0

La única forma en que la aplicación puede encontrar el código para ejecutar es buscando un objeto para un método. Entonces sí, siempre ejecuta un método en ese objeto. –

1

El código no se ejecuta linealmente.

En primer lugar, define una clase que preparará datos para una página cuando se llame a un determinado método (get). Esta es la definición de clase de MainPage.

Luego, registre esta clase con el sistema y también le dirá cuándo usar esta clase. Puede ver que eso sucede en el código que comienza con application = .... El código allí le dice al framework webapp que use MainPage cuando la ruta URL es /. Como puedes imaginar, puedes registrar múltiples clases para diferentes rutas aquí. Tenga en cuenta que este fragmento de código se ejecuta una vez antes de llamar al main.

A continuación, defina el punto de entrada del programa: main(). Es simple: le dices al framework que comience a funcionar con el application que construiste. El código de run_wsgi_app espera una solicitud, comprueba la ruta de URL contra las clases registradas cuando recibe una, obtiene una respuesta de la clase registrada llamando a su método get() y envía una respuesta. Por supuesto, esto es una gran simplificación de lo que realmente está sucediendo allí.

Finalmente, llama a main en el último bloque de código.

En resumen: en primer lugar llamamos main, que llama run_wsgi_app, lo que crea una instancia MainPage y llama a su método get() utilizando la estructura application.

+0

Gracias, vhallac, su explicación es simple y clara. Pero, me gustaría saber: ¿por qué cuando se llama a main() y se crea el objeto (MainPage istantiated) ejecuta el método get CUANDO no hay nada que llame get, sino solo una definición de get (def get (self)) . No entiendo cómo ocurre el flujo de control aquí, porque si fuera un script de función ordinario, después de definir un procedimiento tendría que llamarlo. ¿Podría darme una explicación sobre esto? – craftApprentice

+0

El corredor de la aplicación WSGI llama a .get() porque se utilizó el método HTTP GET para visitar el sitio. –

+0

Gracias más una vez, Ned. Sin embargo, estoy empezando a entender lo que sucede "porque el método HTTP GET que se utilizó para visitar el sitio" todavía me resulta un poco oscuro. Pero sé que eso creo, con más ejemplos que podré entender (con otros ejemplos más allá de get(), como post()). Creo que obtener el procedimiento tiene esto llamado ocultismo, pero otros procedimientos (como post()) tendrán una llamada de función más clara. Gracias por compartir tu conocimiento y tu tiempo. – craftApprentice

Cuestiones relacionadas