Python avanzado (Introducción 3 a Python) | Kalob Taulien | Skillshare

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Python avanzado (Introducción 3 a Python)

teacher avatar Kalob Taulien, Web Development Teacher

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      ¡Bienvenido a Python 301!

      1:27

    • 2.

      Crear tu primera clase de OOP

      5:11

    • 3.

      Propiedades de la clase OOP

      5:57

    • 4.

      Métodos de clase de OOP

      9:34

    • 5.

      Limpieza de la clase OOP

      2:35

    • 6.

      Herencia de la clase OOP

      6:12

    • 7.

      Interfaces de clase de OOP

      3:41

    • 8.

      OOP El super de super

      8:31

    • 9.

      Métodos OOP Dunder

      9:22

    • 10.

      Errores y excepciones

      6:10

    • 11.

      Catching las excepciones

      9:35

    • 12.

      Qué son los decoradores y cómo crear uno

      7:09

    • 13.

      Qué son los generadores y cómo crear un uno

      12:19

    • 14.

      Pipenvs: otro tipo de entorno virtual

      8:25

    • 15.

      Tu proyecto final

      20:09

    • 16.

      Resumen de Python 301

      1:00

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

838

Estudiantes

8

Proyectos

Acerca de esta clase

Bienvenido a Python 301, donde vas a aprender Python avanzado de Python.

En este curso vamos a abordar estos principales temas:

  • Clases (programación orientada en objetos)
  • Intenta con excepción (de errores, de grácil de errores)
  • Decoradores (funciones en el interior de las funciones)
  • Generadores (procesamiento de datos performante)

¡Y tu proyecto final va siendo una aplicación de bancario! Lee más sobre el proyecto sobre el proyecto de en la sección de proyectos de clase.

Conoce a tu profesor(a)

Teacher Profile Image

Kalob Taulien

Web Development Teacher

Profesor(a)

Hi everybody! I'm Kalob Taulien.

 

Here's the TL;DR (short) version about me:

I have been coding since 1999 and teaching people how to code since 2013 I have over 350,000 web development students world-wide I'm on the Wagtail CMS core development team (Wagtail is Python's #1 most popular website making system) I try my best to answer EVERY question my students have  I love teaching — it's definitely one of my natural talents  Also I love goats! (Great conversation starter with me if we ever get to meet in person)

Below you can find all my Skillshare courses. The categories go from easiest to hardest, except for the Misc. Coding Courses at the very end. 

If you're brand new to coding, start with BEGINNERS WEB DEV.&nb... Ver perfil completo

Habilidades relacionadas

Desarrollo Lenguajes de programación Python
Level: Advanced

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. ¡Bienvenido a Python 301!: Hola y bienvenidos a Python 301. Yo soy Caleb Colleen y hoy voy a ser tu instructor. En este curso, vamos a estar aprendiendo sobre algunos conceptos más avanzados de Python, como la programación orientada a objetos, usando clases, probar excepto generadores, decoradores. Y luego al final vamos a crear una aplicación bancaria para sacar el máximo provecho de este curso, ya deberías estar algo familiarizado con Python. Deberías considerarte un nivel intermedio o un nivel junior, un programador de Python. Y básicamente vas a estar haciendo un poco de tarea al final de cada lección, vamos a estar aprendiendo todo sobre clases, propiedades, métodos, métodos de defensa, herencia de clases, clase interfaces, y todo tipo de cosas en el medio. Entonces vamos a estar manejando con gracia básicamente errores para que nuestro programa no solo deje de funcionar. Para que nuestro programa pueda manejar con gracia un error y seguir trabajando. Y como mencioné antes, al final, vamos a tener un proyecto donde creamos una app, una app bancaria donde puedes retirar o depositar dinero usando Python. Y luego vas a registrar todas tus transacciones en un archivo de transacción. Soy Caleb Colleen y llevo varios años trabajando con Python. Uso Python todos los días, tanto profesionalmente como para Hobbes. Y hoy te voy a estar enseñando Python avanzado. Bienvenido a Python 301 con tu anfitrión e instructor, Caleb Tallinn. 2. Crear tu primera clase de OOP: Empecemos con la lectura de nuestra primera clase de Python. Entonces, en primer lugar, necesitas Python instalado y necesitas poder escribir un poco de Python para hacer uso de este módulo, para hacer uso de Python tres, oh uno. Entonces delante de mí aquí solo tengo código VS es solo un sencillo editor de texto. Puedes usar PyCharm, puedes usar corchetes, puedes usar cualquier editor de texto que te guste. Acabo de casualidad que me gusta el código VS. Entonces frente a mí aquí, lo que voy a hacer es ir a View y luego ir a terminal y sólo abrir esa terminal. Y eso me va a dar un terminal al fondo y mi visor de archivos a la izquierda. Vamos a seguir adelante y crear un nuevo archivo aquí. Y llamemos a este punto de primera clase py. Entonces echemos un vistazo a escribir nuestra primera clase. Pero antes de hacer eso, necesitamos echar un vistazo a alguna de la sintaxis. Entonces cuando estamos escribiendo una función, es como algo a lo largo de las líneas de d f, nombre de función. Haz una cosa. Una clase es un poco diferente. Ahora para instanciar una función, simplemente decimos el nombre de la función, y eso es todo. Ahora una clase es un poco diferente. Una clase comienza con la palabra clase, y esto va a crear lo que se conoce como un objeto. Y en Python, todo es un objeto de archivo como objeto. Una función es un objeto. Una clase no es objeto, pero se manejan ligeramente de manera diferente. Entonces una clase comienza con la clase de palabra clave y luego típicamente le damos nombres en mayúscula, o al menos las palabras en mayúscula son letras en mayúscula. Entonces decimos algo así como clase. Esto es un animal. Y eso es literalmente todo lo que hay para crear una clase y luego para instanciar a esa clase o, o para usar una terminología menos sofisticada para activar esta clase, decimos animal es igual a, esto es un animal. En este punto, esta clase es completamente inútil, pero esto funcionará. Esto no nos dará ningún error. Y podemos demostrar eso entrando en nuestra terminal y escribiendo Python de primera clase dot py. Y no vemos ningún error. Eso significa que esto está funcionando de la manera que queremos que funcione. Si no ves errores, eso es algo bueno. Entonces sigamos adelante y creemos aquí un ejemplo de vida real. Entonces este ejemplo va a ser literalmente sólo un ejemplo animal. Y vamos a usar este ejemplo a través de casi todo este módulo python 301 o este curso. Entonces sigamos adelante y creemos una nueva clase. Nosotros decimos clase. Le damos un nombre colon, y luego podemos hacer algo aquí dentro. Ahora en las próximas lecciones, vamos a hablar de propiedades y métodos y cosas así. Pero por ahora, vamos a seguir adelante y darle a esto una propiedad de símbolo. Y esto es realmente sólo una palabra elegante para una variable dentro de una clase. Y así tenemos algo así como una propiedad. Y esto es en realidad palabras clave no iban a usar que usarán como propiedad uno es igual a algo. Entonces podemos instanciar a esta clase o activar esta clase diciendo que el animal es igual a una clase animal. Tiene los paréntesis. Hay mucho como una función. Y entonces podemos decir imprimir la propiedad de punto animal uno y se puede ver audiófilos para mí usando VS Code. Y así esto se parece mucho a un objeto de diccionario, pero un diccionario se ve algo así. Está buscando una palabra clave. En una clase usamos notación de puntos y ese punto simplemente significa que esto va a ser algún tipo de clase y esto es algún tipo de propiedad o una variable dentro de esa clase. Vamos a seguir adelante y ejecutar esto. Y vemos que dice algo, sea lo que sea que esto no esté aquí. Ahora podemos sobrescribir eso y vamos a hablar de eso en futuras lecciones. Eso podemos cambiar por completo. No tenemos que usar la propiedad uno en absoluto. Literalmente podemos nombrar esto. ¿ Algo más? Voy a seleccionar esto. Ir a ver o es su selección, selección agregar siguiente ocurrencia. Y va a seleccionar ambos. Por lo que puedo escribir en dos lugares a la vez. Y puedo decir, esto es una propiedad. Y cuando vuelvo a ejecutar esto, simplemente va a imprimir la palabra algo. Y así se puede ver que estos dos, cuando yo, incluso cuando hago clic ahí, resalté al mismo tiempo, estos están casados. Y así para darle sentido a esto, creamos una clase llamada animal, le dimos una propiedad, solo una propiedad aburrida, sosa. Nosotros lo codificamos duro, así que en realidad no es de mucho uso en este momento. No hay mucho uso para ello. Entonces instanciamos esa clase y la tiramos en una variable. Y al hacer eso, activamos esta clase o instanciamos a esta clase. Entonces dijimos en esa variable activar la propiedad. Esta es una propiedad. Ahora, ahora mismo esto se parece mucho a un diccionario. La sintaxis es ligeramente diferente, pero esto se parece mucho a un diccionario. Entonces lo que me gustaría que hicieras es crear un ejemplo Clase Animal o realmente cualquier tipo de clase. Dale una propiedad, codifica el valor, activa esa clase y luego imprime esa propiedad. Entonces, esencialmente, haz lo que hice en este video. Cuando termines de eso, pasemos a la siguiente lección donde hablamos de propiedades de clase un poco más en profundidad. 3. Propiedades de la clase OOP: Bienvenido de nuevo. En esta lección vamos a estar hablando de propiedades de clase. Entonces para seguir adelante desde nuestra última lección, simplemente voy a copiar y pegar lo que tenemos de nuestra lección anterior, que acabo de renombrar desde el último video. Tan solo para que sea un poco más fácil administrar estos archivos al descargar la fuente. Pero básicamente voy a tomar este código exacto y moverlo a esta siguiente lección, así, y voy a hacer esto avanzando a través de Python 301. Entonces en la última lección, hablamos de que esto es una propiedad. Tenemos una clase, esta es una propiedad y esta está codificada para ser la cadena, algo. Ahora esto no tiene por qué ser una cuerda. Esto podría ser un booleano, una lista, o un diccionario, o podría ser literalmente cualquier cosa. Pero hagamos uso de algo que sea un poco más complicado. Entonces hagamos uso de un diccionario. Entonces vamos a tener una propiedad aquí dentro. Se va a poner en alguna forma de diccionario. Y aquí dentro podríamos decir que T1 es entonces igual al valor uno. Y entonces tenemos que instanciar eso. Esto lo hicimos en la última lección. Utilizamos la variable después de que la clase animal haya sido instanciada. Esta es una propiedad y esto va a imprimir un diccionario. Entonces si ejecuto esto, imprime un diccionario. Ahora sabemos que se trata de un diccionario, y en este punto esto es sólo una variable estándar. No hay nada especial en esto. Simplemente pasa a ser que aquí hay una clase. Después una propiedad. Considéralo una variable. Y luego para acceder a una clave como lo haríamos en un diccionario regular, sólo le damos el nombre clave y eso coincide aquí mismo. Entonces cuando guardo esto y vuelvo a ejecutar el guión, podemos ver que dice valor uno. Y así vamos a ver esto mucho en el nivel profesional Python, vamos a ver conjunto de propiedades como diccionarios. Esto es algo muy común. Y así va a ser realmente útil para que sepas que esta es una clase, esta es una propiedad. Y esta propiedad, su tipo de datos o su estructura, es un diccionario. Lo que significa que entonces podemos buscar las cosas, pero no tiene que ser necesariamente un diccionario. Podríamos decir esta lista y sólo voy a darle cualquier nombre es igual a una lista de nombres quizá. Entonces tenemos bastón, Caleb, y gully, que es un gato lindo, en realidad no es literalmente es un gato bastante grande. Y entonces podríamos decir, imprimir el animal, esta lista. Y cuando volvamos a ejecutar esto, vamos a ver aquí abajo, dice Cain, Caleb, y gully, y aparece como una lista. Ahora porque esta es una lista podemos hacer indexación y corte y cosas en ella igual que una variable de lista regular simplemente pasa a ser que está dentro de una clase. Eso es realmente todo lo que hay a ello. Entonces si quisiéramos conseguir, digamos gully, recuerden listas comienzan en 0. Entonces esto es 0 índice uno, índice, dos índice. Diría esta lista. Corchetes duros a, y esto va a imprimir la palabra gulley o el nombre gully para nosotros, así como eso. Ahora cuando se trata de asignar automáticamente propiedades, podemos hacerlo con esta cosa llamada método defender, un método de doble subrayado. Vamos a hablar de eso en su propia lección particular. También podemos usar funciones como propiedades, y eso llega a ser un poco más avanzado. Vamos a hablar de eso en la siguiente lección. Entonces en esta lección, lo que me gustaría que hicieras es crear una clase, dársela a propiedades. Y en lugar de simplemente usar una cadena o un número o algún tipo de tipo de datos simple. Usar un nuevo tipo de tipo de datos no son uno nuevo, sino una estructura de datos más compleja. Entonces el primero debe ser un diccionario y el segundo debe ser una lista. Y luego intenta acceder a ese diccionario enlistarse desde dentro de la clase. Ahora una cosa divertida que podemos hacer porque lenguajes de programación tenemos estas cosas llamadas propiedades privadas. Python no tiene privado ni público. Todo es sólo una especie de accesible. Entonces lo que también podríamos hacer es imprimir animal dot esta lista. Y eso es simplemente ir a, en lugar de arrojar la clase a una variable, vamos a acceder a esta propiedad por su clase directamente. Entonces si seguimos adelante y ejecutamos esto, vamos a ver huellas de nuestra lista para nosotros como esperamos. Entonces no hay privado, no hay público, Nada de eso. Conozco PHP y Java y todos estos otros lenguajes tienen eso. Python no tiene eso. Ah, y una cosa más, en realidad, no debería olvidar esto. Vas a ver esto todo el tiempo. Siempre que veas una propiedad, empieza con un guión bajo como este. Se trata de una propiedad privada. Entonces así es como nos salimos con la suya en Python, lugar de decir esto va a ser privado, como en algunos idiomas, literalmente usamos la palabra privada. Empezamos con un guión bajo. Y cuando empezamos con ese subrayado, simplemente estamos diciendo que se trata de una propiedad privada. No lo acceda desde fuera de la clase, así que no lo acceda de esta manera. Solo debe usarse internamente alguna vez. Ahora aún no sabemos cómo usar esos internamente. Entonces vamos a aprender de eso en el próximo par de lecciones. Pero lo que me gustaría que hicieras es seguir adelante y darle una oportunidad a esto, prueba esto. Crea un diccionario de clase animal, una lista, propiedad privada, y luego crea una instancia de tu clase. Imprime algo de tu diccionario o listas, y luego trata de imprimir directamente desde ese animal, esa clase animal. Una de las propiedades sin instanciarlo y sin lanzarlo directamente a una variable. Entonces hay dos formas de hacer esto. Adelante y dale una oportunidad a eso. Pruébalo. Por favor. Pruébalo. Esto es importante porque cuando te metes en el mundo de, por ejemplo, machine learning o incluso simplemente Django web framework. Vas a ver clases por todas partes. Es importante saber cómo funcionan las clases en Python. Por suerte, son bastante fáciles de aprender. Entonces en la siguiente lección, sigamos adelante y hablemos de los métodos de clase. 4. Métodos de clase de OOP: Hola, hola, hola. En esta lección, sigamos adelante y hablemos de los métodos de clase. Métodos de clase. Honestamente, es sólo un término elegante para una función dentro de una clase. Y así se ve exactamente como una función. Aquí sólo hay una diferencia distinta. Entonces vamos a seguir adelante y deshacernos de esta variable privada que es sólo de la última lección. Y vamos a crear un nuevo método. Entonces este es un método. Esto es todo lo que hay y esto se parece exactamente a una función estándar. Y así lo hará todo un método es, es una función dentro de la clase. Ahora una cosa a tener en cuenta aquí es que en un método estándar dentro de una clase, su primer parámetro siempre es auto. Ahora si vienes de como un fondo JavaScript, vas a ver esto, o PHP usa esto también. En PHP usa algo como esto. Entonces me pone dólar firmar esto y luego una flecha. Javascript utiliza la palabra clave this. En Python, usamos la palabra clave self. Y lo que eso hace es cuando decimos yo mismo, ahora podemos imprimir auto punto y tenemos acceso a todo. Y puedes ver el código VS se llena automáticamente. Esto para mí, tenemos auto punto. Este es un método, esta es una propiedad, esta lista. Entonces sigamos adelante e imprimimos esta lista. Aquí hemos escrito un método. Ahora sigamos adelante y activarlo. Y para activarlo o para ejecutarlo. Vamos a instanciar a esta clase animal porque esta es una mejor práctica. En lugar de acceder al animal por sí solo, lo arrojamos a una variable. Entonces decimos el punto de búho anime. Se trata de paréntesis de método. Y a diferencia de una función donde vemos un argumento de palabra clave o un argumento posicional requerido aquí como yo, no tenemos que hacer eso, simplemente podemos ignorarlo. Entonces, a pesar de que el auto se usa dentro de la clase, fuera de la clase, lo ignoramos completamente al 100% como si no existiera. Y eso es sólo decir porque este es un objeto de clase dentro de aquí, va a tener acceso a todo dentro de la clase. Y la razón por la que hacemos eso es para que no tengamos que poner constantemente nuevos argumentos. Por lo que no tendríamos que decir esta lista. Esto es propiedad, etcétera, etcétera, etcétera. No tenemos que pasar constantemente estas cosas porque tendríamos que poner en una lista aquí. Y entonces este siguiente va a ser un diccionario ahí ya establecido aquí. No tenemos que pasar esos, así que voy a deshacer eso y simplemente correr, este es un método. Imprimir auto, esta lista. Y otra vez, el yo se refiere al animal. Esta lista propiedad, clase, propiedad. Vamos a seguir adelante y ejecutar este Python 301 lección de tres métodos de clase, y lo imprime para nosotros. Entonces con la palabra clave self, tenemos acceso a otros métodos, otras propiedades, todas esas otras cosas buenas dentro de esta clase. Todavía no tenemos acceso a otras clases. Es sólo esta clase en particular y a eso se refiere el yo. Self se está refiriendo a la clase animal en la que estamos trabajando. A continuación, también podemos definir propiedades usando métodos. Y de nuevo, para bajar esto en términos más laicos, podemos crear una variable de clase basada en una función de clase. Vamos a seguir adelante y crear una función o un método llamado get. Golly. Se va a tomar a sí mismo como su primer parámetro, siempre lo hace. Y podríamos regresar porque básicamente es una función, self.age, esta lista. Y luego barranco es el número dos, su índice al 012. Ahora, cuando tratemos de conseguir esto, vamos a tener que decir, hazte carajo con paréntesis. Ahora si se supone que esto actúe como una propiedad en lugar de una función, digamos que aquí no hay nada y solo se supone que devuelva una simple pieza de datos. Podemos usar una cosa llamada decoradora, que hablaremos también en el futuro. Y sólo decimos en la propiedad. Y lo que esto va a hacer es decir, cualquier tipo de lógica aquí, cualquier lógica y este método podría volverse enorme, aunque podría ser un 100 líneas de código aquí si quisiéramos. Siempre va a poner esto en una propiedad. Y cuando esto es una propiedad, nos deshacemos de los paréntesis. Ahora porque estamos usando la palabra clave return al igual que una función, Esto en realidad no va a hacer nada. Este es un método aquí arriba, en realidad es imprimir. En este caso, hagamos esto un poco más complejo. Usemos un método como una función regular y en realidad devolvemos algo. Entonces podemos decir barranco es igual al animal, conseguir barranco. Y eso nos va a permitir usar esto más adelante para que podamos imprimir. El dedo más lindo consiguió de todos los tiempos es Golly. Adelante y ejecutemos esto. Y vamos a ver que esto imprime a cosas diferentes. Se va a imprimir. Este es un método porque está ejecutando esto que se va a imprimir. Y luego vamos a imprimir el Gatto más lindo si todo el tiempo es galera. Y mira eso. Imprime nuestra lista igual que lo hizo en el primer ejemplo, en el segundo ejemplo y nuestra segunda declaración impresa. Esta es nuestra clase, Esta es nuestra propiedad. Y se puede ver que en realidad se parece mucho a una función, pero tiene un decorador en ella, básicamente diciendo, oye, pesar de que este es un objeto ejecutable, o lo que llamamos un callable. Trátalo como si no fuera un callable, tratado como si se tratara de una propiedad estándar como esta lista. Y esta es una propiedad. Y debido a que usamos la palabra clave return, va a poder luego tirar eso a una variable, cualquier nombre de variable. Y entonces podemos usar esa variable por el camino. Ahora echemos un vistazo a un ejemplo más. Vamos, vamos a crear un ejemplo donde agregamos un nombre a esta lista. Entonces aquí podemos decir muerte, porque vamos a crear un método. Agregar nombre. Siempre se va a tomar auto y el nombre va a ser el parámetro que vamos a agregar. Entonces podemos escribir auto punto, este punto lista anexar ese nombre. Y podemos, si queríamos regresar ya sea self.age, esta lista como toda la nueva lista porque todo lo que hicimos fue tomar una lista. Si te olvidas del yo por solo un segundo, se ve igual a una lista regular, list.append. Esto simplemente pasa a estar accediendo desde fuera de la función o del método. Por lo que tenemos propiedad de clase. Se trata de una lista para que podamos usar dot append en ella. Vamos a anexar el nombre aquí. Y luego nos va a devolver esta lista. Y vamos a ver esto mucho. Entonces sigamos adelante y comentemos ese código. Y digamos el punto anti-malware. ¿ Y cómo lo llamamos? Lo llamamos agregar Nombre y toma un nombre. Ignorar yo mismo. El auto siempre entra ahí pero lo ignoramos. Agregar Nombre, y luego el nombre va a ser ruibarbo. Entonces si quisiéramos, podríamos imprimir el punto animal esta lista. Y vamos a ver que esta lista ahora tiene Doo-doo-doo-doo vino Caleb barranco, y ruibarbo. Y así estamos agregando cosas dinámicamente a nuestras propiedades ahora usando un método. Adelante y corre esto. Y dice Caín, Caleb barranco, y ruibarbo como se esperaba. Y de nuevo, todo lo que estamos haciendo aquí es que estamos usando tipos de datos, tipos datos estándar de Python dentro de una clase. Y así estamos encapsulando o, ya sabes, para bajar eso porque nos gustan nuestras grandes palabras como desarrolladores, incentivo encapsular, Piensa en ello como contienen. Entonces todo lo que estamos haciendo es contener todo este código en una clase. Y la idea aquí es que estamos agrupando funciones y variables o métodos y propiedades. estamos agrupando en esta cosa llamada animal, esta clase llamada animal. Y la idea aquí es que todos estos están relacionados de alguna manera. Entonces lo que me gustaría que hicieras como tu tarea para esta lección es crear un animal de clase. Crea una propiedad, hazla una matriz, o hazla una lista, una lista de Python. Después escribe un método para no agregar algo sino para eliminar algo de esa lista. Por lo que en lugar de agregar, podría llamarse remove name. Recuerda tomarte como primer parámetro un 100% del tiempo que siempre despega. Dentro de esto, un método en particular, entonces podemos acceder a self dot, cualquiera que sea su lista se llame, dot remove y luego el nombre. Y luego aquí abajo podemos decir, bueno, lo instanciamos. Esta es nuestra clase, Este es nuestro nombre de método. Por lo que el tuyo se llamaría quitar nombre, y luego el nombre a quitar. Y luego puedes imprimir otra vez esa lista entera y ver que en realidad fue eliminada. En la siguiente lección, sigamos adelante y limpiemos esto. Entonces esto parece un poco más de pierna, un ejemplo del mundo real porque ahora mismo esto es código desordenado y esto es solo código tutorial. Esto no es bueno. Vamos a crear un ejemplo real de una clase animal en la siguiente lección. 5. Limpieza de la clase OOP: Escribo, despegando de esa última lección, lo que vamos a hacer es limpiar un poco esto y crear algo de una instancia animal real, o a veces llamamos a la instancia de clase porque es una instancia de una clase. Y básicamente vamos a deshacernos de todo esto y vamos a crear una clase animal adecuada. Entonces, ¿qué tipo de cosas no tiene el animal? Un animal tiene un color de piel. Y digamos que para un color va a ser naranja, entonces un animal también tiene acciones que puede tomar. Qué tipo de acción no puede tomarla podría def, comer, podría hacer algo. Y recuerda, siempre nos metimos aquí dentro. También podríamos hacer sordos Chase porque va a perseguir su comida. Digamos que esto es como un tigre o un cheeto o algo así. Y esto también va a tomar el auto como su primer parámetro. Entonces instanciamos a esta clase, llamemos a este tigre es igual y animal. Y entonces podemos hacer ese tigre. Podemos hacer un IIT. Podríamos hacerlo Chase, podríamos imprimir su color de piel o podemos hacerlo, hagamos esto. Hablar Def. Se va a llevar yo y esto simplemente va a imprimir rar, rar, animal dot hablar. Y así cuando ejecutemos esto, cuando ejecutemos lección de Python para limpieza de clase, se va a imprimir rar, tal y como lo esperamos ahora esto no es nada que no hayamos cubierto ya. Y si solo estás pisando Python 301 y eres algo nuevo en Python y solo te estás preguntando qué pasa esto. Esto simplemente significa que no hagas nada más que permitir la sangría. Porque si no tenemos este pase aquí, sigamos adelante y veamos qué tipo de error de sangría vamos a conseguir. Obtenemos un error de sangría esperado un bloque sangrado tras sordo Chase. En realidad lo está buscando aquí, haciendo todo lo posible para averiguar dónde está. Pero simplemente ponemos pase ahí. Ahora esta es una clase muy genérica y honestamente no hay nada súper útil en esto. Pero en la siguiente lección hablaremos de la herencia de clases. Entonces no hay tarea para esta lección. Yo sólo quería mostrarles que voy a limpiar un poco esto. En la siguiente lección, vamos a extender esta clase animal y vamos a crear, digamos, un tigre real o un tipo diferente de animal. Y entonces podemos sobrescribir el método speak, el método chase method. Podríamos agregarle todo tipo de cosas. Entonces, cuando termines de verme limpiar este código, pasemos a la siguiente lección donde hablamos de herencia de clases. 6. Herencia de la clase OOP: Eso es herencia. Entonces una de las cosas realmente bonitas detrás de Python, o supongo que realmente cualquier clase en cualquier idioma, no tiene que ser python. Pero lo bonito de una clase es que podemos extenderla. Y así en lugar de solo decir animal de clase y luego tener otra clase llamada tigre y otra clase llamada house cat. Podríamos, en lugar de tener que calificar, hablar, comer persecución por un color una y otra vez, simplemente podemos extenderlo. Y entonces lo que voy a hacer aquí es deshacerme de esto y crear una nueva clase. Y este va a ser llamado tigre. Y entre paréntesis, se va a extender animal. Y puedo tomar pasar aquí para literalmente no hacer nada. Y es automáticamente porque está extendiendo esta clase animal aquí arriba. Automáticamente va a obtener el color de la piel, hablar, método de comer y método de persecución. Entonces lo que puedo hacer es ahora escribir tigre es igual a una clase Tiger. Tigre dublespeak, y en lugar de escribir, animal es igual a una clase animal o tigres igual a una clase animal. Ahora podemos decir que Tiger es igual a una clase de Tigre y luego el tigre habla. Entonces ejecutemos este código y veamos qué sucede aquí. Corre menos de cinco. Y dice rawr. Ahora solo por diversión, sigamos adelante e imprimamos esto. Veamos qué tipo de tipo es este. Tipo de impresión, tigre. Y va a decir rar, pero también va a decir tigre principal. Esto es diferente al animal. Si cambiamos esto por animal, vamos a ver que seamos como RAR o el animal principal de clase. Y así cambiamos eso. Ahora, lo bueno de esto es que podemos sobrescribir todo aquí. Entonces en lugar de decir Habla crudo o podemos decir algo más. Sordo, habla, se necesita uno mismo. Y qué es este tigre que íbamos a decir, ahí creció ¿verdad? Al igual que Tony el Tigre y conseguirlo. Ok. A lo mejor no es la broma más grande que he hecho nunca. Pero sigamos adelante y ejecutemos esto y vamos a ver que en realidad vamos a deshacernos de esta línea. Ya no necesitamos eso. Cuando ejecutemos esto, ya no va a decir rar porque estamos instanciando a la clase Tiger. Tiene hablar. Es heredar clase. También tiene habla. Cuál va a correr. Bueno, porque estamos instanciando a la clase Tiger y estamos sobrescribiendo hablar, va a correr este. Por lo que va a decir su tasa como se esperaba. Vamos a seguir adelante y crear un ejemplo más y vamos a crear una clase house cat. También se va a extender desde un animal. Y cuando sobrevaloremos hablar, vamos a hacer que diga. Y eso es todo lo que vamos a hacer ahí. Y en lugar de tigre , habla tigre, todavía podemos mantener eso instanciado si quisiéramos. No está haciendo nada así que en realidad podríamos borrarlo por. Vamos, vamos a mostrarte un ejemplo donde tenemos tanto una clase de tigre como una clase de gato house. Por lo que ahora podemos escribir gato es igual a casa gato, gato punto hablar. Y también escribamos tigre, dublespeak. Y uno va a decir que son geniales y el otro me va a salvar. Y sigamos adelante y ejecutemos esto. Y esta es la regla y el miau. Ahora en este punto del tiempo, probablemente estés pensando, bueno, esto no es bueno. Es decir, bien podría escribir una clase regular de gato casa y no extenderme de animal si estoy anulando lo único que estoy usando de todos modos, si eso es lo que estás pensando. Sí. Tienes toda la razón. Sigamos adelante y miremos eso para el color sin embargo. Imprimamos gato punto para el color. Y vamos a ver que esto es naranja. Son grandiosos miau, y dice naranja. Pero podemos sobrescribir eso. Podemos decir que el color de la piel es igual al negro. Vamos a guardar eso y volver a ejecutar esto. Y ahora va a decir negro. Y así por defecto, heredó el naranja como su color de piel justo como un defecto. Entonces es algo así como un plano. Y luego cambiamos eso por un color para que este gato de la casa en particular sea negro. Ahora esencialmente lo que estamos haciendo aquí es que estamos creando algún tipo de blueprint con esta clase, y esto se llama interfaz. En la siguiente lección, vamos a hablar de interfaces y tipo de lo que son y cómo las implementamos y la razón por la que incluso las escribimos. Pero por ahora lo que me gustaría que hicieras es crear una clase llamada animal. Es posible que ya tengas uno. Y luego quiero que amplíen esa clase. Yo quiero que heredes esa clase. Al escribir clase tu nuevo nombre de clase. Extender animal poniendo los animales entre paréntesis aquí entre paréntesis. Y luego puedes sobrescribirlo atributos o sus propiedades. También puedes sobrescribir sus métodos. Y luego quiero que instancien a ese gato de la casa o lo que sea animal que elijas usar. Y luego cualquiera que sea el método que elijas para sobrescribir si es hablar, comer, tal vez algo totalmente nuevo. A lo mejor es algo que está fuera de lo que has visto en este módulo hasta ahora. Yo quiero que lo ejecuten. Gato dot habla. Me va a imprimir. Y luego quiero que lo hagas, como has sobrescrito una de tus propiedades aquí dentro, necesitaré también imprimir esa propiedad. Y así aquí acabo de imprimir no por color. Y de nuevo, es realmente, realmente importante que aprendas cómo funcionan las clases. Porque en marcos como Django web framework, vamos a estar usando muchas clases. Y es importante saber que aunque no supieras de qué animal el zip de Hamlet que ahí arriba. Simplemente colapsó eso así que hasta digamos que no sabes lo que hay dentro de animal. Serías capaz de sobrescribir de alguna manera lo que hay dentro de animal. Tú, podrías explorar y descifrar, oh, un animal tiene un color de piel, pero quiero sobrescribir eso. Tiene un método de hablar. Ok? Sí, sí, tiene un método de hablar predeterminado, pero también quiero sobrescribir eso. Entonces, cuando termines de eso, pasemos a la siguiente lección donde hablamos de interfaces de clase. 7. Interfaces de clase de OOP: Vamos a tener una conversación en torno a lo que es una interfaz. Entonces, esencialmente, si querías hervirlo, una interfaz de clase es literalmente solo un blueprint. Y así todo lo que está diciendo es que va a haber algún tipo de propiedad. Va a haber algún tipo de métodos o simplemente un método y simplemente se supone que debe implementar algo. Y en la última lección creamos un tigre y un gato casero. Sigamos adelante y solo eliminemos estos sólo por un segundo. Crearemos otros nuevos. Y vamos a trabajar sólo con este animal. Y típicamente cuando ves una interfaz, vas a ver que hay algún tipo de método y solo va a pasar. O vas a ver algo así como raise, no implementado error. Y vamos a dar a esto un mejor ejemplo aquí. Vamos a extender animal, hagamos clase. House cat se va a extender la clase animal y simplemente pasar. Eso es entonces instanciar a ese gato de la casa. Por lo que podemos decir house cat es igual a host Kat o gato es igual a house cat. Y entonces podríamos hacer punto de gato. ¿ Y cuál sobrescribimos aquí? Bueno, no sobrescribimos nada, pero sabemos que automáticamente va a heredar hablar de la clase Animal. Entonces sigamos adelante y hablemos. Y vamos a ejecutar este archivo. Esta es la lección seis interfaces de clase, y dice que no implementado. Ahora la idea aquí es que simplemente tienes un plano y ahí es cuando usas esto. Se supone que debes implementar esto. Si quieres usarlo, tienes que implementarlo. Y así deshacerse de este error no implementado o si solo está pasando no está devolviendo ninguno. Podríamos simplemente decir def speak. Se va a tomar el auto como su único parámetro, parámetro obligatorio dentro de una clase. Imprimir, miau. Y así lo que esto está haciendo aquí es decir, hey, house cat va a usar la interfaz animal o este plano. Si tratamos de usar hablar bien, no hay nada implementado, así que tenemos que implementar eso. Y debido a que extendimos animal, sobreescribimos hablar para que esto ya no funcione. Por lo que se puede pensar de esta manera. Tomamos estas dos líneas y se parece mucho a esto. Boom, simplemente lo reemplazamos. Pero la interfaz o el plano simplemente se supone que nos diga que se supone que debe implementarse. Entonces, cuando guardemos esto y vuelva a ejecutar esto, no vamos a obtener un error no implementado. Ahora vamos a obtener la impresión como se esperaba. Y así que ese es más o menos el único papel de una interfaz. Y las interfaces es un blueprint que dice, hey, si quieres usar el método talk o cualquier método, tienes que implementarlo tú mismo. Pero sólo para que lo sepas, cada vez que te extiendas desde él, house cat siempre tendrá el método talk y es nuestro trabajo como desarrolladores sobrescribirlo. Ahora, tu tarea para esta lección es crear una interfaz. Entonces si ya tienes una clase de animal, si has estado siguiendo junto con Python 301, probablemente ya no tengas clase de animales. Adelante y en lugar de usar talk, Adelante y plantea un error no implementado en comer o perseguir, u otra función o método de su elección. Extender esa clase o heredar esa clase, crear una nueva. Acabo de crear uno llamado house cat, y luego sobrescribir ese método. Es posible que ya hayas hecho esto una vez antes. No es mala idea volver a hacerlo. Esta vez estamos implementando una interfaz con error no implementado. A continuación vamos a hablar de la súper función. 8. OOP El super de super: Entonces mucha del tiempo que vas a ver con clases que porque podemos extender una clase, vas a, vas a poder acceder a una función por encima de ella. Entonces piensa en esto como abajo y animal está arriba. Y así si pensamos en esto como una jerarquía, que es como me gusta pensarlo. Simplemente estamos anulando el discurso, que es lo que hicimos en la última lección. Pero si quisiéramos, podríamos ejecutar lo que sea que esté aquí. Entonces en lugar de sobreescribir hablar, Vamos a sobrescribir comer. Entonces en nuestra interfaz animal, sigamos adelante e imprimimos. Yo estoy comiendo. Yum, yum, yum. Y porque estamos extendiendo house cat desde animal, Ahora podemos instanciar a ese gato house y podemos decir comer. Y ya lo hemos hecho un par de veces. Entonces no vamos a ver nada nuevo aquí. Dice, estoy comiendo yum, yum, yum. Y a pesar de que el gato house no tiene un método sobre él, las clases que heredan de animal, lo tiene. Entonces se nos permite usar eso. Ahora digamos que queríamos sobrescribir el método eq, pero también queríamos ejecutar el código que está aquí. Hagamos dos ejemplos aquí. Def, comer auto, imprimir. Yo estoy comiendo salmón. Y cuando volvemos a ejecutar este gato dot eat, bueno hemos sobrescrito el método original de interfaz eat. Y así todo lo que vamos a ver ahora es que estoy comiendo salmón. Pero ¿y si, y si por alguna razón quisiéramos también ejecutar esto? Lo que podríamos hacer es una especie de burbujearlo. Entonces recuerda que esto es el fondo, esta es la parte superior. Podemos burbujear hasta la clase animal y ejecutar comer. Ahora hay dos formas de hacer esto. Ahí está el camino correcto y el camino equivocado. El camino equivocado es escribir animal dot eat. Porque esto no es instanciado en una variable todavía ni nada apropiado. Es decir, podemos acceder técnicamente, pero realmente no deberíamos hacerlo de esta manera. Y entonces la forma correcta es simplemente decir super. Es un punto de función comer. Y si hay algún tipo de parámetros extra aquí, simplemente igualamos los parámetros. No tenemos ningún parámetro, no tenemos que pasar en uno mismo. Está en una clase que ya sabe que se está pasando automáticamente. Y entonces lo que esto va a decir es conseguir la clase que está por encima de ella, la clase Animal, eso es lo que el super está haciendo aquí. Y luego ejecutar el método de comer. Entonces va a conseguir esa clase animal que ese método de comer. Y luego lo va a ejecutar por nosotros porque dijimos comer con paréntesis, ¿no? Están ejecutados. Se va a imprimir, estoy comiendo yum, yum, yum. Y luego se va a imprimir, me estoy comiendo Sammy, vamos a seguir adelante y guardar esto y darle una oportunidad a esto. Y vamos a ver que hace exactamente lo que estoy describiendo aquí. Estoy comiendo yum, yum, yum, estoy comiendo salmón. Y así todo lo que hizo de nuevo fue burbujear hasta esa clase animal. Ejecutar punto comer. Lo que sea que esté aquí podría ser una declaración impresa, podría ser cualquier cosa. Ejecutará todo lo que hay dentro. Y luego escribimos lo que queríamos. Y otra vez, esta podría ser cualquier lógica que se quiera escribir en lo que sea. Realmente no importa que sea una declaración impresa. Podría ser matemáticas, podría ser un raspador web. Podría ser lo que quieras. Ahora sigamos adelante y hagamos un ejemplo más con chase, pero añadamos algunas palabras clave aquí. Entonces en nuestra clase animal tenemos persecución sorda, yo mismo. ¿ Y qué vamos a perseguir? Vamos a perseguir a una gacela. Eso es lo que queremos perseguir. Vamos a perseguir y animal. Y esto se va a imprimir, estoy persiguiendo a un animal. Y asegurémonos de que el animal por defecto sea una gacela. Espero estar deletreando eso bien, tal vez no. Y cuando baje aquí, Cat ab.js ahora lo va a hacer, porque aún no lo hemos implementado por nuestra cuenta. Viene de la interfaz. Se va a decir que estoy persiguiendo lo que sea el animal, que pasa a ser una gacela por defecto. Es ir adelante y correr esto. Y dice que estoy persiguiendo una gacela. Ahora también podemos pasar en una palabra clave aquí. El gato podría estar persiguiendo a un ratón. Vamos a seguir adelante y ejecutar esto. Y dice que estoy persiguiendo ratón. Divertido inglés ahí, estoy persiguiendo una gacela o un ratón o algo así. Ahora para implementar Chase, podemos hacer, hacer, hacer, podemos escribir def, persecución, auto, animal. Va a coincidir con lo que vemos aquí arriba. El animal por defecto va a ser gacela, pero siempre vamos a pasar en un animal, así que no vamos a hacer este argumento de palabra clave. Entonces vamos a decir súper punto persecución. Vamos a pasar a ese animal de aquí arriba, lo que sea que va a ser. Entonces va a decir que estoy persiguiendo por defecto porque yo, pero tal vez es el animal está persiguiendo a un ratón. Estoy persiguiendo a un ratón. Y entonces podríamos imprimir animal fue capturado y podríamos usar cuerdas f si quisiéramos, o simplemente una declaración de impresión regular. Realmente no importa en este punto. Estos son sólo ejemplos. Vamos a seguir adelante y ejecutar esto. Y esto va a correr gato dot Chase, que está aquí. Se va a súper a esta. Se va a decir que estoy persiguiendo un, cualquiera que sea el animal. Por defecto es gacela si no se proporciona. Y aquí estamos diciendo que se requiere. Y entonces vamos a pasar eso. Vamos a seguir adelante y ejecutar esto. Y le falta una palabra clave aquí. Así que sigamos adelante y arrojemos el ratón como palabra clave aquí. Y no una palabra clave, sino un argumento posicional requerido. Vamos a seguir adelante y correr esto una vez más. Y dice que estoy persiguiendo a un ratón. Ratón fue atrapado y así persigue ahora haciendo lo que sea que la interfaz nos esté diciendo va a hacer. Luego burbujeamos usando el super método o la super función. Dijimos, hey, donde sea que esto se extienda desde cualquier clase que se esté extendiendo desde EU que luego ejecuten el método de persecución y simplemente pasamos en animal. Por lo que los animales en realidad haciendo mucho atravesando aquí. Pasamos en animales una cuerda aquí. Se va entonces a entrar aquí, luego va a entrar aquí. Entonces se va a sobrescribir aquí. Entonces en lugar de gacela va a ser Mouse y simplemente vamos a imprimirlo. Por lo que estamos moviendo bastante datos. Y esto es muy común en Python. En realidad es común en todos los lenguajes basados en clases. que todo suceda antes de que incluso llegue a imprimir animal fue capturado y luego se imprime animal fue capturado. Ahora bien, este es un concepto algo complicado para envolverte la cabeza. Entonces lo que me gustaría que hicieras es crear una nueva clase de interfaz que puedes llamar animal just, me gustaría que lo escribieras desde cero. Igual de buena práctica, ya sabes. Entonces crea como una interfaz animal, haz que persiga algo y simplemente hace una cosa. Entonces extiende ese animal. Extendí mi para ser gato de la casa. El tuyo podría ser un tigre, un guepardo, un elefante. Realmente no importa. Sólo asegúrate de extenderlo, sobrescribir ese método Chase y utilizar esta super función en él. Y recuerda súper simplemente va a decir, oh, bien, esto se extiende desde un animal de clase. Esa es nuestra interfaz que está aquí arriba. Y entonces se va a decir persecución. Entonces ahora está hablando de este animal que es súper persecución. Ese es este método aquí. Se va a imprimir luego, estoy persiguiendo a un animal de algún tipo, y luego ejecutar algún código debajo de él. Solo estamos usando declaraciones de impresión simples, pero en realidad podrías usar la lógica de Python adecuada si quisieras. Podrías agregar números. Se puede raspar un sitio web, se podría hacer prácticamente cualquier cosa. Simplemente nos estamos quedando con algo bastante simple para que nuestras cabezas se envuelvan alrededor de la idea de la programación orientada a objetos. Una vez que hayas hecho eso, pasemos a la siguiente lección donde hablamos de métodos de defensa. Y bajo método esencialmente nos permite tomar acción automática. Y por ejemplo, nuestro animal siempre tiene un color de piel de naranja. Pero, ¿y si estamos usando un elefante? Bueno entonces tendríamos que escribir el primer color aquí. Supongo que va a ser gris. O vamos a tener que llevarnos ese gato de la casa. Y vamos a decir gato, color de piel es igual al gris. Y en este punto solo estamos trabajando con variables. Esa no es forma de vivir tu vida. También podríamos tirarlo aquí cuando se está instanciando. Hablaremos de eso en la siguiente lección. 9. Métodos OOP Dunder: Hablemos de los métodos de defensa. Y entonces lo que digo aquí es d, u y d son caspa y lo que esto significa es doble subrayado. Y así estos son métodos mágicos que vienen con la clase. Si ya estás familiarizado con las clases en otro idioma, vas a estar familiarizado, su mayor parte con los métodos de caspa. Y somos métodos mágicos como se les llama en algunos otros lenguajes de programación. Entonces volvamos a subir a nuestro animal aquí, y vamos a crear un método defensor llamado init. Y comienza con subrayado DEF, subrayado EN TI, subrayado, subrayado. Es un método, por lo que siempre toma el auto como su primer parámetro. Y entonces podríamos darle cualquier otro parámetro. Y así esto podría ser por el color. Y entonces puede hacer una cosa. Y lo que esto nos permite hacer es introducir código aquí abajo, que estamos extendiendo. Ahora podemos poner un color de piel aquí y dejar que el color podría ser gris, por ejemplo. Ahora, actualmente esto no va a hacer nada, pero si ejecutamos este código, vamos a ver que no va a haber un error. Simplemente no hay ningún error que vaya a aparecer. Va a ser lindo, genial. Es hacer exactamente lo que hicimos en la última lección. Pero lo que estamos diciendo ahora es que podemos pasar en un argumento posicional requerido. Adelante y corremos esto sin gris ahí dentro, pesar de que init está aceptando para el color. Y vemos faltante un argumento posicional requerido. Ahora retrocedamos un segundo. ¿ Qué hace aquí un punto? Init simplemente está diciendo cuando se crea una instancia de esta clase, cuando se activa esta clase, incluso si se está extendiendo o heredando en otra clase, ahora necesitamos pasar algo y esto se va a ejecutar antes de cualquier otra función. Y así siempre que usamos subrayado, subrayado init, lo que esto está diciendo es lanzar algún tipo de parámetro o parámetros o argumentos, y eso se va a ejecutar automáticamente para que no tengamos que entonces escribir cat underscore, underscore init, gris, algo así. Simplemente lo va a hacer automáticamente por nosotros. Y así podemos teclear gris aquí. Y sigamos adelante y demos a prueba que esto se va a ejecutar ante todas nuestras otras funciones. Imprimir para color es para color de subrayado. Y usemos una cuerda F aquí. Y dice para el color es gris, luego se ejecutó, estoy persiguiendo a un ratón. Linda ejecutó ratón fue capturado. Y así hay un orden de operaciones aquí. Ahora init es con mucho el más común que vas a ver. Y esto simplemente significa que podemos trabajar con el color. Ahora por defecto que para un color va a ser naranja. Adelante y deshacernos de eso. Ya no necesitamos eso y podemos simplemente, porque sabemos que esto se va a ejecutar primero, simplemente podemos decir auto punto para el color es igual a para el color. Y lo que esto nos permite hacer es entonces usar self.view color en cualquier otro método que queramos utilizar, ya sea en la clase animal o está en y clase heredada o una clase extendida, nos va a asignar automáticamente eso. Entonces, vamos a deshacernos de esa declaración impresa. Y vamos a crear otro método aquí. Def get for color self. Y simplemente imprimamos auto punto para el color. Ahora, en su mayor parte, se puede ignorar todos estos porque no vamos a estar usándolos en este video. Lo que vamos a hacer es crear una clase. Tirar automáticamente en el color de piel se va a luego asignar color self.view. Podemos entonces, una vez que instanciemos esta clase, podemos hacer cat dot get por color. Este es un método, por lo que toma paréntesis. Y lo que eso va a hacer es porque no hay get for color method en nuestro house cat, pero hay uno en la interfaz animal va a ejecutar esto, y simplemente va a ejecutar cualquier color que pongamos aquí. Y así como un mejor ejemplo, escribamos esto. Obteniendo por color. Y esto va a decir conseguir el color. Gris. Dice conseguir por un gris de color. Hagamos naranja o un ACH o corrió. Y va a decir conseguir un color naranja. Y entonces lo que es bueno de esto es que ahora podemos usar la super función. Por lo que podemos decir def en ella en nuestra clase extendida. Auto para color super debido a hacer init. Y eso va a tomar también el primer color. Y entonces lo que En cualquier momento instanciemos a un gato house, como lo estamos haciendo aquí abajo, vamos a sobrescribir esa función init, esta de aquí arriba. Pero en lugar de simplemente anularlo, en realidad queríamos hacer todo para hacer por defecto. Digamos que estábamos contentos con esa lógica. No queremos sobrescribirlo, simplemente queremos extendernos de ella. Entonces vamos a permitir que se asigne self.view coloreado. Y entonces podemos, si queríamos imprimir algo así como color de piel se guardó en el objeto de clase. Y entonces podríamos hacer algo más aquí si quisiéramos. Pero vas a ver esto mucho también. En nivel profesional Python, siempre vas a ver e init o no siempre, pero muchas de las veces vas a ver una red y veces nos vas a ver sobrescribirla. Y así lo estamos anulando aquí y estamos diciendo en realidad, sí queremos anularlo, pero también queremos usar la lógica regular que viene con ella, sea lo que sea. Y entonces queremos tal vez hacer algo más. Entonces digamos que no necesariamente queríamos sobrescribir el tipo de animal cada vez. Podríamos decir aquí arriba, tipo animal es igual a desconocido. Y podríamos forzar ese tipo de animal en la casa gato self.age tipo animal es igual a hospedar a Kat. Vamos a seguir adelante e imprimir auto punto tipo animal. Y así en este punto, ahora estamos usando init. Estamos usando un Dundee donde estás usando declaración de impresión súper regular. Ya hemos visto que un billón de veces ya estaban obligando entonces a ese tipo de animal a no ser pasado a init. No está ahí en absoluto. Por defecto, se desconoce. Pero como es un gato de la casa, queremos codificar duro esto. Queremos decir que el gato de la casa siempre va a ser el gato de la casa. No importa lo que hagamos, siempre será anfitrión Got It no es cambiable. Y así no tiramos house cat aquí. Simplemente estamos diciendo instanciate house cat y va a tener un animal tipo de gato casa ahí dentro. Y va a imprimir eso y ejecutar esto. Y dice que para el color se guardó en el objeto de clase. Eso es justo aquí arriba. Corría súper allá arriba. Entonces hacemos, hacemos, hacemos, hacemos, hacemos. Sabemos que el color self.view es accesible y tenemos acceso a eso en todos nuestros métodos. Entonces dijimos que el tipo animal es un gato casero e imprimimos ese tipo de animal. Y así primera declaración de impresión, house cat es la segunda declaración impresa. Dónde está ahí mismo, dice casa gato, y eso coincide aquí abajo palabra por palabra, carta por letra. Y luego estamos consiguiendo el color de la piel y estamos diciendo que es naranja. Y eso viene de aquí debido a, debido a hacer conseguir por el color. Y simplemente ponemos eso para el color en un punto. Esto está llegando a ser bastante avanzado. Python para ser honesto. Pero lo estamos pasando aquí diciendo autof.age para el color. Y luego en un método estamos accediendo a self.view color. Ahora bien, si estás mirando este video, rascándote la cabeza, yendo genial. No entiendo ni una sola cosa que se acaba de decir. Lo que me gustaría que hicieras es probar esto. Quiero que pruebes esto hasta que tenga sentido porque vas a ver esto en todas partes, sobre todo, sobre todo a nivel profesional Python. Esto es muy importante que entendamos tanto los métodos super como la caspa. Ahora en esta lección realmente solo estamos hablando del método de cena y del método en red como resumen, simplemente significa ejecutar esto antes que cualquier otro método dentro de nuestra clase. Podemos anularlo. Podemos usar super en él. Podemos hacer lo que queramos. Se parece mucho a un método regular, como hablar. Simplemente sucede que se ejecuta primero automáticamente y esos parámetros lanzan a la derecha en la instanciación de clase. Y así ahora esto se parece mucho a una función con un parámetro. La única diferencia es que se trata de una clase y esto automáticamente va a ser accesible a lo largo del resto de nuestra clase. Yo quiero que le des una oportunidad a esto. Por favor dedique al menos diez minutos en esto y simplemente juguetear con un par, aunque no pueda conseguir que funcione, es bueno gastar esos diez minutos en él. Y sólo porque cómo se diseñan los cerebros, aunque luche con ello, está bien. Es una buena práctica sin importar. Adelante y dale un tiro a eso por unos diez minutos. Si no consigues que esto funcione en unos diez minutos, siéntete libre de seguir adelante. Tendrás mucho tiempo en el futuro para practicar usando métodos de caspa y super. 10. Errores y excepciones: Bienvenido de nuevo. Dejemos de hablar de clases. ¿ Podemos pasar algo así como ocho lecciones juntos hablando de clases? Y sí, son importantes en Python, son extremadamente importantes en Python, pero hay otra cosa que es extremadamente importante en Python más avanzado, y así es como podemos gestionar el flujo de errores. Entonces hacemos esto, intentamos una cosa, excepto otra cosa. Y lo que esto simplemente está haciendo es decir, intenta un bloque de código. Y si hay un error, haz otra cosa. Entonces se parece mucho a una declaración if else. La única diferencia es que busca errores. Y así echemos un vistazo a un simple tri-accept. Y así la sintaxis se ve así. Vamos a probar un trozo de código. Y así vamos a intentarlo. El total es igual a uno dividido por 0. Ahora si entramos en nuestro shell de Python y hacemos uno dividido por 0, vamos a ver que esto nos da un error de división 0. No se puede dividir por 0. Matemáticamente, es sólo uno de esos roles no se les permitió hacerlo. Entonces lo que podemos hacer ahora es aceptar cualquier tipo de excepción. Y podemos decir que el total va a ser 0. Imprimir el total. Y esto es realmente todo lo que hay a un try y excepto bloque en Python. Lo importante, en, lo importante aquí es que va a probar una pieza de código. Si falla, plantea algún tipo de excepción como lo que vemos aquí, un error de división 0. Después se va a omitir esta línea de código y todo lo que está debajo. Esto no se ejecutará simple ya que eso luego va a salir de este bloque y luego va a intentar luego ejecutar la excepción. Y así cuando ejecutamos esta lección de Python nueve, errores y excepciones, no deletreé las excepciones bien, por cierto, tengo que arreglar eso. Eso me va a molestar. Excepciones mejor. Vemos el total aquí abajo es 0 y eso es porque está consiguiendo 0 aquí. Y como ejemplo, hagamos esto. Imprimir probando uno dividido por 0. Vamos a mover eso hasta la cima. Y luego imprimamos algo debajo. Esto no se presentará. Y vamos a imprimir uno más aquí. Se captó excepción. Vamos a seguir adelante y correr esto una vez más. Y dice probar uno dividido por 0. Esto no va a aparecer, no se presentó en nuestro guión aquí abajo. Y dice que se captó la excepción. Ahora en este punto del tiempo, deberías estar pensando, oh, caramba, dónde voy a usar como espero que estés haciendo esa pregunta y si estás haciendo esas preguntas, pasemos a un ejemplo adecuado aquí. ¿ Qué pasa si le pedimos al usuario alguna entrada? Por lo que pide un número. Vamos a decir entrada. ¿ Qué es un número? Entonces vamos a asegurarnos de que esto siempre sea un número. Entonces vamos a decir que num es igual a, y lo vamos a lanzar como un entero. Entonces no importa lo que alguien escriba aquí, siempre va a ser un número, va a ser un número completo. Y vamos a imprimir eso, imprimir num. Y cuando ejecutamos esto, ¿cuál es el número? Escribamos diez. Y sólo tiene diez. Enfriar. Pero, ¿qué pasa si alguien no escribe un número? Bueno, eso todavía se va a almacenar en esta variable. Entonces vamos a tratar de lanzar ese número como un entero. ¿ Y qué pasa si no es un entero? ¿ Y si escribimos Python 301? Obtenemos un error de valor. Literal inválido para int con base diez. Básicamente lo que eso está diciendo es que no puede convertir una cadena en un número con una base de diez. Pero el TL, DR, la historia corta aquí es que simplemente ha fallado. No pudimos imprimir esto. No pudimos trabajar con esto. Entonces, ¿qué hacemos? Pedimos un número. Tratamos de lanzar eso como un entero. Si no funciona, podemos hacerlo excepto todas las excepciones. Entonces podemos decir que ese número va a ser desconocido y simplemente imprimirlo. Y esto nos va a permitir imprimir ese número, que no hacía antes, porque se erró y se va a decir desconocido. Entonces vamos a intentarlo. ¿Cuál es el número? Python 301. Y dice desconocido. Si volvemos a ejecutar esto, dado un número real, dice que el número es diez. Y así lo que esto hizo fue que dijera, oh, en realidad, no podemos manejar su error de valor. Python simplemente no sabe cómo convertir una cadena en un número correctamente, una manera que es predecible para ti, el programador. Y así entonces arroja una excepción. Atrapamos esa excepción y sobrescribamos num para ser desconocidos, y luego simplemente la imprimimos. Ahora este es un caso de uso realmente bueno porque y si estás tratando hacer algo y no resulta de la manera que esperas. Ahora lo que me gustaría que hicieras es probar esto. Ya sea puedes probar con el primer ejemplo. Este de aquí arriba donde intentamos dividir uno por 0, simplemente no funciona. O puedes probar este ejemplo, que es el que prefiero porque está más cerca de ser un ejemplo de la vida real. Pide algún insumo. Intenta lanzar ese número como un entero, capta la excepción, sobrescribe el número y luego imprímalo. Y lo siguiente de esto es que nos estamos metiendo en un simple manejo de errores y flujo de errores. Y de nuevo, lo importante de esto está en nuestro primer ejemplo, si miramos aquí, nuestro código simplemente murió. No había manera de recuperarse de eso. Y así todo lo que estamos haciendo con un try-except ES graciosamente captando ese error y administrándolo para que nuestro script no muera para que nuestro código pueda seguir ejecutando la forma en que se supone que debe ejecutarse. Adelante y dale una oportunidad a eso. Es un ejemplo bastante sencillo. Por lo que esto sólo debería llevarte un par de minutos cuando estés listo. Pasa a la siguiente lección donde hablamos de atrapar algunas nuevas excepciones. Vamos a atrapar excepciones particulares. 11. Catching las excepciones: Hablemos de atrapar excepciones particulares y averiguar qué excepción está lanzando y cómo podemos manejar múltiples excepciones. Entonces vamos a crear un ejemplo aquí, y esto sólo se va a recrear a partir del último ejemplo. Vamos a decir que algún tipo de número es igual a entrada, introduce un número. Entonces podemos tratar de cambiar ese número en un número, porque cuando pedimos entrada, siempre vuelve como una cadena. Y podemos aceptar esa excepción haciendo lo que queramos. Y digamos que este número va a ser desconocido. Y simplemente imprimamos el número cuando hayamos terminado con él. Adelante y ejecutemos este guión. Esto es menos de diez. Introduce un número, diez, imprime diez, introduce un número. Python. Dice Se desconoce el número. En el primer ejemplo, ingresamos un número diez , volvió como una cadena. Y int fue capaz de tipificar esto a un entero. Entonces eso funcionó perfectamente bien. En el segundo ejemplo, escribimos Python. Esencialmente esto es lo que hicimos. Ahora no podemos convertir una palabra en un entero, simplemente no funciona. Python no sabe en qué Python, esta cadena se opone a convertirse en un número. De todos modos no de manera predecible, por lo que arroja una excepción. Ahora cuando se lanza la excepción, dijimos que ese número va a ser desconocido. Ahora, ¿cómo sabemos cuál es esa excepción? Podemos averiguar cuál es esta excepción escribiendo excepto excepción ya que E. Excepción impresión fue capturada. Y entonces podemos imprimir tipo de E. Vamos a seguir adelante y ejecutar esto de nuevo. Y tecleemos python como nuestro número. Y dice que la excepción fue capturada clase ValueError, y se desconoce. Entonces ahora lo que podemos hacer es aceptar específicamente un error de valor. Por lo que podemos agregar otra excepción aquí excepto un error de valor. num de impresión no era un número válido. Y probemos esto. Esto tiene múltiples excepciones aquí. Entonces tecleemos Python tiene un número, y dice que Python no era un número válido. Y luego se imprimió aquí abajo. Python es lo que escribimos. No se pudo lanzar a un número o un entero. Entonces dijimos lo que fuera ese valor no es un número válido. Ahora esto se parece mucho a un if else, if, else if if. Entonces va a probar algo así como una declaración if. Si entonces capta este error en particular, no va a ejecutar ninguna otra excepción aquí. Sólo va a ejecutar esta única excepción en particular. Y así ahora tenemos una manera de lidiar con un error de valor específico. ¿ Y si quisiéramos entonces hacer algo con este número? Digamos que num fue perfectamente aceptado, baja el número diez, y luego queríamos dividirlo por otro número. Entonces vamos a crear una segunda entrada. Lo llamaremos num para ingresar un segundo número. Y vamos a dividir estos. Entonces vamos a decir num dos es igual a int num dos. Y el total va a ser NUM dividido por m2. Ahora si num1 y num2 son ambos capaces de ser lanzados en un entero. Se va a correr Total. No obstante, si uno de estos no se puede convertir en un entero, entonces va a arrojar un error de valor. Entonces vamos a atrapar ese error de valor con una excepción e imprimir cualquier número que no fuera un número válido. Y de hecho, podría no estar entumecido. Podría estar entumecido a. Entonces digamos entumecido o entumecido a no eran números válidos. Y probemos esto. Introduce un número. Hagamos 100. Y tu segundo número, diez. ¿ De acuerdo? No hay errores. Esas son buenas noticias. ¿ Y si hiciéramos el primer número en ser 100 y el segundo número es 0. Bueno, en la última lección intentamos dividirnos por 0. No podemos hacer eso. Y así podemos ver que se captó la excepción. No ejecutó un error de valor porque no se nos arrojó ningún error de valor. Entonces no podemos captar ese error. Pero hubo otro error u otra excepción que se nos arrojó que podemos entonces excepto entonces imprime excepción fue captada. Imprimir el tipo de excepción. Y trabajamos con un número, que en realidad ya no necesitamos hacer. Podríamos querer trabajar con totales en su lugar. Y no lo sé. Ahora cuando imprime Tipo II, dice clase ZeroDivisionError. Lo que podemos hacer es atrapar eso por sí mismo también. Podemos decir excepto 0, error de división, números de impresión no se pudieron dividir div lo hice. Y vamos a deshacernos de eso. Probemos esto otra vez. Ingresa un número diez y su segundo número 0, y dice que los números no se pueden dividir. No hay error de valor lanzado esta vez. Eso significa que ambos fueron capaces de, ambos estos números, num1 y num2 fueron ambos lanzados en enteros perfectamente bien. Por lo que no hubo error de valor que atrapar. Por lo que se saltó esto. Pero entonces dijo total es igual a entumecido uno dividido por num2, diez dividido por 0. Bueno, puedes dividir cualquier cosa por 0, obtenemos un error de división 0. Entonces dijimos, vale, intenta atrapar un error de valor si existe, si no lo hace, intentemos atrapar el ZeroDivisionError. Después cogimos ese ZeroDivisionError e imprimimos algo más. Y debido a que éste fue ejecutado, no se ejecutó la excepción genérica en la parte inferior, este código simplemente se omitió. Por lo que Python va a escoger una de estas excepciones, cualquiera que sea la correcta. Y va a ejecutar una de estas avenidas de código. Siempre, siempre, siempre, siempre intentará ejecutar este código. Y si hay algún error, se va a comprobar para ver si fue un error de valor. Comprueba si se trataba de una comprobación de error de división 0 para ver si se trataba una excepción general amplia de algún tipo que no estamos captando explícitamente. Y así en este momento, ahora estamos captando un error de valor, 0 error de división. O si hay algún tipo de aire que nos desconoce, entonces podemos trabajar con eso. Ahora, digo tratar de atrapar porque vengo de otros lenguajes de programación también. En Python decimos try excepto que es exactamente lo mismo, solo una palabra clave diferente. Y vas a ver probar excepto por todo el lugar en Python profesional. Y la razón de eso otra vez es porque queremos probar algo. Y si hay un error, si no intentamos aceptar ese error, nuestro código simplemente va a morir. No queremos que eso suceda. Queremos que siga ejecutándose, queremos que siga adelante, continuando. Y así atrapamos con gracia cada uno de estos errores, o en términos generales captamos cada error, cada excepción, y trabajamos con él. Y eso sólo significa que nuestro código puede seguir funcionando. No nos va a dar error. Y eso significa que todo nuestro código aquí abajo seguirá ejecutándose. Y eso son buenas noticias. Porque y si estás construyendo un programa como el bot de raspado web de Google, y llega a un sitio web y está tratando de raspar una dirección de correo electrónico en particular y verificando la dirección de correo electrónico. Y tal vez esa dirección de correo electrónico en realidad no existe. Al igual que es, es que pasó. Pensamos que no era una dirección de correo electrónico, pero no es una dirección de correo real. Bueno, si Google Boston no captara ese error, simplemente moriría y entonces alguien tendría que ir y reiniciarlo. Y tendrías a alguien en Google todo el tiempo solo escribiendo Python scrape internet, Python scrape internet, Python scrape internet, Python Stream Internet. Y nuestro trabajo como programadores es a si nos podemos automatizar fuera de un trabajo. Y así va a entonces tal vez tratar de conseguir una dirección de correo electrónico u otra página web. Se va a entonces tratar de hacer algo. Y si no puede, quizá se lo salte. A lo mejor intenta un trozo de código diferente. A lo mejor intenta hacer otra cosa. Y entonces no tenemos a alguien en el otro extremo de una computadora escribiendo Python. Raspe internet dot py, Python scrape internet dot py, Python scrape internet dot py. Cada vez en Arizona, solo va a manejarlo automáticamente por ellos. Y ese es el poder detrás de try y excepto es que puedes aceptar cualquier tipo de error. Estos simplemente pasaron a ser errores de palabra clave lanzados exactamente desde Python. Podemos crear los nuestros propios también si quisiéramos. Y entonces podemos manejar con gracia un error. Y eso significa que nuestro código se ejecutará para siempre sin ningún problema. Ahora lo que quiero que hagas, quiero que pruebes esto, escribas algún tipo de ejemplo, y puedes robar mi ejemplo si quieres, donde intentas algún código y tú excepto un error, un tipo de error específico. Entonces aceptas otro tipo de error. Y luego aceptas sólo unas áreas generales. Incluso Asegúrate de imprimir tipo E para que puedas lidiar con eso más adelante. Adelante y escribe este complejo tri excepto bloque, y cuando estés listo, pasemos a esa siguiente lección. Buena suerte, y nos vemos allá. 12. Qué son los decoradores y cómo crear uno: Hablemos de decoradores. Ahora si volvemos a una lección en particular, es uno de estos métodos. Sí, podemos tener esta cosa llamada decoradora. Y un decorador es simplemente una función que envuelve otra función. Y en esta lección vamos a crear nuestro propio decorador de Python. Entonces salgamos de esto y creemos un nuevo archivo Python. Lo llamaremos menos de 11. Deco lee recorridos ese corredor. Por lo que típicamente tenemos algún tipo de función, myFunc. Y esto simplemente va a imprimir mi nombre es Caleb. Entonces podemos ejecutar myfunc así. Esto es Python, cosa de uno a uno justo aquí. Enfriar. Esto funciona muy soso, muy aburrido. Esto no está en una clase. Esto no está en un intento. Atraparnos no es hacer nada nuevo. Pero digamos que queríamos escribir un decorador que típicamente se ve así. Deck o un Tor tiene el símbolo at y luego el nombre de una función. Y todo lo que va a hacer es ejecutar una función llamada decorador y tirar esta función dentro de ella para que podamos ejecutar algo antes o después automáticamente. Entonces sigamos adelante y creemos un decorador. Y así podemos crear mi decorador. Y esto va a tomar una función igual que myfunc. Myfunc se va a lanzar ahí como una función completa, no como variable, sino que tiene una función. Por lo que estamos pasando funciones a funciones en este punto. Entonces podemos crear algún tipo de envoltorio y típicamente vemos la palabra rapero. Esto es muy, muy común. Imprimir. Haz algo aquí. Entonces podemos ejecutar esa función, sea lo que sea, imprimir función original está terminada. Y simplemente devolvamos al rapero. Y así esta es una función dentro de una función. En realidad vimos esto, creo que fue en Python 201, donde podemos poner una función dentro de una función. Y esto fue esencialmente un decorador en ese momento. Y entonces lo que estamos diciendo aquí es que mi decorador va a tomar una función como su único parámetro. Entonces va a registrar una nueva función llamada rapero va a hacer algo, ejecutar esa función original. Estamos hablando de un alcance extraño en este punto de JavaScript, esto se llama un cierre. Ejecutar dicha función, cualquiera que sea esa función, y luego imprimir otra declaración. Por último, devolvemos el envoltorio. Entonces ahora hay dos formas de decorar una función. Vamos a seguir adelante y deshacernos de esto aquí arriba porque sabemos que MyFunc simplemente va a imprimir mi nombre es Caleb. Podríamos llamar a esta nueva función es igual a mi decorador. Y debido a que se necesita una función, vamos a lanzar MyFunc. Ahora note que aquí no tenemos los paréntesis. No estamos ejecutando MyFunc donde simplemente lanzarlo como una función por sí misma, no como una función ejecutada, igual que el objeto de función. Entonces podemos decir nuevo func, ejecutar esto como su propia función. Adelante y probemos esto. Y dice hacer algo aquí. Mi nombre es Caleb, función original está terminada. Y realmente esto es todo lo que hay a un decorador. Ahora sigamos adelante y hagamos esto de una manera más pitónica y inalámbrica más moderna. Corta eso y vamos a moverlo arriba. Y decoremos myfunc con mi decorador. Y como estamos usando este tipo de sintaxis, ya no necesitamos envolver esto aquí. Simplemente podemos escribir mi func. Adelante y deshacernos de eso. Y tecleemos myfunc. Myfunc, mi función aquí está decorada con mi decorador. Va a pasar en esto automáticamente. Eso va a registrar envoltorio, imprimir una cosa, hacer una cosa, imprimir la función original está terminada. Devolver ese envoltorio. Sigamos adelante y salvemos, y ejecutemos esto. Y funciona de la misma manera ahora esto es muy pitónico. De esta manera me gustaría mejor. Vas a, vas a ver de esta manera probablemente con más frecuencia que no. Y todo esto es, es exactamente lo mismo que esa primera función. No la función, sino el primer ejemplo. Y todo lo que estamos diciendo es hey, usa aquí el símbolo at como decorador. Envuelva mi decorador alrededor de mi función. Entonces va a ejecutar a mi decorador en algún lugar dentro de ahí. Se va a ejecutar la función original. Y entonces podemos hacer algo antes o después o nada si no queremos, literalmente no podemos hacer nada. O sea, eso sería inútil de decorador no hacer nada. Pero podríamos hacer algo antes y después, lo que nos hace realmente, realmente poderosos. Ahora, ¿por qué alguna vez haríamos esto? Bueno, porque a veces tenemos una función y simplemente nos gusta lo que está haciendo. Y simplemente queremos agregarle un poco de lógica extra, un poco de funcionalidad extra. Y así no necesariamente siempre queremos cambiar nuestra función original, pero tal vez sí queremos tomar esa función original y extenderla. Entonces se parece mucho a la herencia de clases, donde tomamos una clase regular y luego la heredamos a una nueva clase o la extendimos a una nueva clase. Esto es tomar una función y extenderla con mi decorador. Ahora se trata de un decorador muy, muy, muy sencillo, pero lleva el ejemplo a través. Entonces lo que me gustaría que hicieras es quiero que crearas un decorador y quiero que lo utilices de esta manera. No lo utilices la forma basada en funciones, la forma original que vas a ver de vez en cuando. Pero esta es la forma más pitónica. Entonces crea una función, llámalo mi decorador. Su único argumento va a ser la función en sí, no la función ejecutable, sólo el nombre de la función. Y así básicamente hemos reasignado un nombre de función como variable aquí. Dentro de eso, vas a necesitar registrar otra función. Haga una cosa, ejecute esa función original, haga una segunda cosa, y devuelva esa función interna. Por lo que tenemos funciones dentro de funciones. Se quiere devolver esa función interna, luego crear otra función, solo una normal. Podría ser una declaración impresa, podría tener alguna lógica real. Podría hacer lo que quieras y decorarlo con en mi decorador. En medios es un decorador. Mi calificador deco simplemente coincide con el nombre de la función decoradora. Adelante y ejecuta myfunc con y sin el decorador. Por ejemplo, si me deshago de ese decorador y ejecuto esto, imprime una línea. Si vuelvo a poner ese decorador y vuelvo a ejecutar esto, imprime tres líneas. Yo quiero que sigas adelante y le des una oportunidad a esto. No es muy a menudo vas a crear realmente tus propios decoradores. Más o menos vas a estar usándolos. Pero incluso la posibilidad de que te metas como código abierto o Python realmente avanzado, entonces vas a estar creando tus propios decoradores. Y es realmente importante saber cómo funcionan estos y el orden en que suceden las cosas. Por ejemplo, tenemos algo sucediendo antes de nuestra función, después de nuestra función. Adelante y prueba eso y cuando estés listo, pasemos a nuestra siguiente lección. 13. Qué son los generadores y cómo crear un uno: Bienvenido de nuevo. Hablemos de generadores. Entonces un generador es, es realmente, concepto realmente interesante. Entonces, por ejemplo, si tienes una lista, por lo que LST es igual a 123123 se van a almacenar en la memoria en todo momento. Ahora digamos que esta lista tiene 10 millones de números en ella, que si te estás metiendo en la ciencia de datos, a podría tener 10 millones de números en ella y no quieres almacenar todo eso en la memoria porque entonces tienes que subir la RAM en tu computadora. Y tu computadora va a necesitar, básicamente tu computadora se va a poner realmente cara si solo le arrojas hardware. Un generador es una forma software de decir hacer algo con el primer número, luego hacer algo con el segundo número, luego hacer algo con el tercer número, y no le importa lo que vino antes o después de él. Ahora un generador se suele poner en algún tipo de función. Por lo que podríamos decir def myfunc para algún tipo de número en un rango, rangos ya un generador en Python tres. Por lo que 14, por ejemplo, imprimir num. Y cuando ejecutemos myfunc, Python Lección 12, Eso no va a hacer nada porque está en la función. Probémoslo una más. Ahí vamos. Dice 012345678910111213. Está bien. No está mal. Ya sabes, solo estamos trabajando con 14 números. Esto no es técnicamente un generador. Pero digamos que queríamos hacer algo grande, como hacer que esto siempre devuelva todos estos números al exponente de sí mismo. Por lo que haríamos entumecidos al exponente de num. Entonces por ejemplo, diez al poder 1013 al poder del 13. Y en lugar de regresar, que sólo se va a ejecutar una vez, como, probemos esto. Eso no va a funcionar. Vamos a hacer total es igual a myFunc y luego imprimir el total. Se presenta con solo un número. ¿ Y si quisiéramos números múltiples? ¿ Y si estamos trabajando con números realmente grandes? Uno dijo que podríamos usar la palabra clave llamada yield. Y lo que el rendimiento va a hacer es que va a decir que esta función ya no es sólo una función golpea a un generador, va a recorrer cada número del 0 al 13 y va a ceder lo que sea ese número. Dos el exponente de sí mismo. Ahora sigamos adelante e imprimamos esto. Y vemos cuando imprimimos mi func, es un generador. Ahora de nuevo, recuerda generador sólo va a funcionar un número a la vez. Entonces en nuestro primer ejemplo donde solo era una lista, sabe de los números 0 a 13. Y de manera técnica podemos acceder a esos números. Pero si estamos trabajando con números realmente grandes, no queremos eso. O si estamos trabajando con realmente big data sets, queremos usar un generador. Por lo que sólo es lidiar con la tarea que nos ocupa. No se trata de nada que vino antes o que viene después de él. Y así la idea aquí es que estás, ahora estás escribiendo código, eso es rendimiento de memoria. Entonces si está haciendo 14 al poder de 14, no le importa el 13 al poder de 13, no le importa el 12 al poder de 12. Simplemente va a hacer esto una vez. Y cuando intentes acceder a ese número, entonces va a hacer las matemáticas. Entonces es un poco perezoso. Se va a hacer la matemática sólo cuando se lo exija. No lo va a hacer de inmediato del bate. No va a tratar de almacenar todo esto en la memoria. Lo único que va a hacer es almacenar 14 al poder 14 en memoria y luego pasar al siguiente número. Se va a hacer 15 al poder 15 y olvidarse totalmente de 14. Ahora en típico Python, digamos que estás haciendo Python para web, no vas a ver rendimiento mucho, pero en la ciencia de datos lo vas a ver mucho, mucho. Y es muy importante que sepamos cómo funciona esto. Vamos a seguir adelante y renombrar esto de myFunc a mi generador. Y vamos a deshacernos de esto. Y ahora podemos decir por num, no los usemos. Digamos Big num en mi generador. Y luego vimos aquí abajo que este era un objeto generador. Podemos recorrer estos números y podemos imprimirlos para imprimir Big num. Y sigamos adelante y ejecutemos esto. Ahora, esto es tan rápido con Python. Ni siquiera vamos a notar lo que está pasando. Pero lo que estaba haciendo fue primero iteración, luego la segunda iteración a la tercera iteración, luego la cuarta, quinta todo el camino hasta la última iteración. Y te das cuenta de cómo estos números se están haciendo bastante grandes. En realidad no le importa lo que vino antes o después de él. Y lo importante de esto es que podemos hacer con números realmente, realmente grandes. Entonces hagamos número realmente grande como 50 a la potencia de 50. Y veamos si esto posiblemente bloquea mi computadora. Mira eso. Fue capaz de hacer todo eso con bastante facilidad. Entonces supongo que me preocupaba que se estrellara mi computadora sin razón alguna. Pero fue capaz de hacer toda esta lógica con bastante facilidad. Y así la idea es, ya sabes, cuando llegó a 49, solo funcionó en 49. No tenía que recordar lo 4993 donde no tenía que importarle lo que viene a continuación. Simplemente decía cuando estaba en 49. Trabajar en 49 al poder 49 nos da este número masivo aquí. Y nada de esto necesita almacenarse en la memoria. tanto que si tuviéramos una lista, tendríamos que tener todos estos números almacenados en la memoria. Ahora, los números son pequeños para almacenar en la memoria, así que en realidad no es tan grande de un trato. Pero cuando se trata de conjuntos de datos gigantes, especialmente en cosas como el aprendizaje automático o la ciencia de datos. Vas a querer usar yield para asegurarte de que tu computadora no se quede sin. Bueno, básicamente pensando poder, no se va a quedar sin RAM. Ahora si alguna vez quisiste acceder a estos, digamos, dijimos, Vamos a comentar eso fuera. Y digamos que queríamos conseguir todos estos números. Por lo que todos los números son iguales a mi generador. Y entonces queríamos imprimir estos números por la razón que fuera. Todos los números. Adelante y ejecutemos esto una vez más. Y no nos da nada. No nos da estos números. En su lugar devuelve un objeto generador. Ahora si queríamos acceso a estos números, lo que podemos hacer es echar lo que sea que este generador va a devolver todo el asunto. Todos estos números. Podemos poner eso en una lista. Vamos a seguir adelante y ejecutar esto quería ser echado como lista. Y vemos todos estos números gigantes aquí. Ahora en este punto en el tiempo en que estamos lanzando esto como una lista, este generador, lo que sea que devuelva, todos estos números es lo que va a devolver se va a almacenar en esta variable llamada todos los números. Entonces ahora en realidad estamos guardando esto para después. tanto que con sólo un generador regular, nuestro ejemplo anterior no guardaba estos números para más adelante. Simplemente estamos haciendo algo con estos números uno a la vez. Pero con una lista. Dijimos, sí, vale, procesa todos estos de uno a la vez. Y entonces todo esto valores guardados de esa palabra clave yield entra en esta lista. Y esa lista se va a ordenar en memoria para que podamos trabajar con esta lista por el camino. Ahora, por qué haríamos esto, o donde haríamos esto es si estamos trabajando con grandes números son mucho procesamiento. Puede hacer mucho procesamiento de una tarea a la vez. No tiene que preocuparse por todas las demás cosas antes o después. Y entonces podemos poner sólo la respuesta en una lista. Entonces mientras la computadora está haciendo 37 a la potencia de 37, no nos importa ese procesamiento. Entonces básicamente estamos diciendo que esto es un poco más ¿cuál es la palabra que busco aquí? Temporal. Es poco más temporal. Y así o desechable agrega una palabra mejor. Va a hacer una cosa. Y luego cuando esté hecho, lo va a arrojar en esa palabra clave yield. Si pasa a la siguiente se va a disponer de este en memoria. Realmente no le importa cuál fue el último. Simplemente se preocupa por la tarea actual que nos ocupa. tanto que con una lista o cualquier otro tipo de datos, una vez que almacenamos en una variable, realidad se está almacenando en esa variable. Entonces usar un generador y luego almacenarlo en una variable. No realmente la forma adecuada de usar un decorador y no un decorador sino un generador. Esto es más o menos lo que vamos a usar. Entonces realmente es una forma de hacer algún tipo de procesamiento y luego tirarlo a la basura. Entonces vamos a decir por cada gran número en mi generador impreso, y va a procesar uno a la potencia de 12, a la potencia de 23, a la potencia de tres, todo el camino hasta 50 a la potencia de 50. Y se va a imprimir de uno a la vez. No lo va a almacenar todo en la memoria. Simplemente va a hacer una cosa a la vez. Entonces es realmente, realmente bueno para el código desechable en conjuntos de datos grandes. Ahora de nuevo, si te estás metiendo en el desarrollo web, no vas a ver generadores todo eso a menudo para ser honesto. Pero si te estás metiendo en la ciencia de datos o el aprendizaje automático, vas a ver esto por todas partes y un concepto muy, muy importante en la programación de Python. Y de hecho, aquí podemos hacer un ejemplo más. Vamos a hacer el checkout range. Por lo que podemos decir que el total es igual a rango de 50 e imprimir total. Y vamos a ver que esto también devuelve un decorador. Y en realidad no devolvió un decorador. Se devolvió el rango de funciones de 0 a 50. Es un generador detrás de bambalinas sin embargo. Y lo que no vemos es que no está dando vueltas y creando una lista de 150. ¿ Y si hiciéramos lista rango 50? Ahora obtenemos una lista de 0 a 49 o 50 números en total. Y así funciona de la misma manera que lo hace nuestro generador inventado. Ahora una cosa a tener en cuenta es que una vez que iteras en uno de los generadores de aquí, ya no va a funcionar para él. Entonces sigamos adelante y descomentemos esto. Deshaznos de este ejemplo aquí abajo, y vamos a volver a ejecutar el guión. Y debería imprimir todos los números. Pero entonces imprimir no va a funcionar en absoluto porque no va a haber nada ahí dentro. El generador se ha agotado. Es un tipo de cosa de uno y hecho. Y en realidad solo estoy mirando este código y no lo va a hacer, porque va a crear un nuevo generador para cada uno de estos. Sigamos adelante y arrojemos esto a una variable. Entonces mi generador var es igual a mi generador. Y cambiemos esto aquí por mi gen var. Y podemos ver que imprime todos estos números, pero no está haciendo nada aquí. Por lo que este generador, esta función, lanzamos esto a una variable. Entonces dijimos, oye, ejecuta esto. Por lo que dice uno a la potencia 12 a la potencia 23 a la potencia 349 a la potencia de 49, todo el camino a través de todos esos números ordenados en una variable, ese generador que se agotó a sí mismo. Entonces si intentamos volver a acceder a ese generador, vamos a ver que no imprime nada. Y todo lo que hizo fue imprimir aquí nuestra lista gigante. Pero no imprimió una a la vez, algo así como esa forma de pirámide que vimos justo aquí arriba. No va a imprimir ninguno de esos porque yo generador está hecho. Es una cosa de uno y hecho. Entonces si queríamos volver a acceder al generador, tenemos que, de una manera extrañamente redactada, acceder de nuevo a ese generador. Y así lo hacemos de esta manera. Dijimos llámalo aquí arriba y luego vuelve a llamarlo aquí abajo. Y esta vez vamos a ver resultados diferentes. Vamos a ver todos estos grandes números. Y por encima de ella vamos a ver esta lista de números. Y así una cosa a tener en cuenta con el generador, es una cosa de uno y hecho. Una vez que agotas ese generador, está hecho. Tienes que crear uno nuevo o no crear uno nuevo. Esa es una mala redacción, pero hay que instanciar o generar un nuevo generador. Una vez que hayas creado ese nuevo generador, entonces podrás hacer lo que quieras con él. Pero si intentas ejecutar ese generador más de una vez, si es como, por ejemplo, almacenado en una variable se va a agotar esa primera vez y solo se preocupa por realizar una vez. No es como una función, una función y puedes seguir usando una y otra vez. Un generador es una cosa de tipo uno y hecho. 14. Pipenvs: otro tipo de entorno virtual: Está bien, hablemos de Pip. Ambientes Pip. Digo Pip env. Y en Python uno a uno o Python 201, no puedo recordar. Utilizamos un comando python llamado Python dash m dot v. Y luego nos metimos dentro de un entorno virtual y esto creó un entorno virtual para nosotros. Hay otra forma de hacerlo, y en realidad hay varias formas diferentes de crear un entorno virtual. Pero otra forma común es un Pip env. Y personalmente me gustan mucho los extremos de Pip porque son agradables y simples. Y así vamos a hacer este en nuestra línea de comando aquí. Eso es hacer eso más grande. Deshacernos de esta barra lateral aquí. Y así estoy en mi carpeta Python 301. En primer lugar, lo que quiero hacer es pip install Pip env. Y debido a que, debido a hacer, se va a cobrar Pip env. Y hoy tengo PIP nth. Ahora lo que puedo hacer es escribir Pip env. Y me da una lista de comandos. Check clean graph, install, lock, open run scripts deberán hundirse, desinstalar y actualizar. Esto es mucho más fácil que escribir Python dash m v, m dot v. En su lugar lo que podemos hacer es escribir. Y voy a despejar esto. Podemos escribir Pip env install, y esto va a crear un entorno PIP para nosotros. Entonces, solo hagamos pip install. Debido a, debido a lo debido hace una cosa. Y dice activar tus proyectos virtual end run pip, shell, Pip shell. Y ahora estamos dentro de un entorno PIP. Se puede ver que estoy dentro de uno porque tiene corchetes por aquí. Adelante y tecleemos python dash v. Y vamos a ver que estoy usando Python 3.9, Cuckoo, cuco. Eso es lindo. Salgamos de esto golpeando a Control D. Así que CTR más D canceló con Control C, Control D, que sale de nuestro Pip env. Ahora si quiero volver a entrar, hago Pip N shell y estoy dentro de ella, entonces puedo hacer pip install. Digamos que quería instalar Django es igual a 2, algo. Doo-doo-doo-doo. Simplemente liderarlo y sólidos consiguiendo 2.2.17. Espectáculo de Pip. Django. Y tengo dos punto a punto diecisiete. Ahora sé en mi computadora que no tengo esa versión. Tengo django 3.1 algo u otro. Y así esto ahora está completamente aislado del resto de mi computadora y en realidad se puede ver ubicación de dónde se está utilizando esto. Está en mi carpeta de usuarios, Caleb Aeolian dot local share EMS virtual, Python tres o uno, ese es el nombre de la carpeta. Entonces algún tipo de hash LIB, Python 3.9 paquetes de sitio. Enfriar, salgamos de aquí con Control D. Y digamos que queremos deshacernos de este ambiente PIP. Podríamos hacer Pip env, dash, dash o M. Y así como eso hecho. Ya no tenemos un entorno PIP. Y así esta es una manera realmente buena de crear un entorno y de eliminar un entorno. Ahora, digamos que tienes un proyecto usando cierta versión de Python. Hay dos formas diferentes de usar Python. Cuando se trata de versionado. Puedes usar pi n y puedes cambiar tu versión de Python. O la forma en que prefiero hacerlo es con Pip env. Y puedo hacer pip install dash, dash Python. Y hagamos Python 3.7. En nuestra última versión o última Pip env, usamos Python 3.9. Y así vamos a seguir adelante y usar Python 3.7. Pip env shell. Despejemos este guión Python V. Y estoy usando Python 3.7.2. Por lo que hay dos formas de usar múltiples versiones de Python. Yo personalmente prefiero esta manera porque cuando termine con él, simplemente puedo decir Pip env, dash, dash r, m, y eso sólo lo va a quitar. Boom, ya no tengo un entorno PIP. Ahora si hicimos ls dash LA, grep, la palabra Pip. Ya vamos a ver que tenemos dos archivos Pip. Ahora este comando en realidad va a ser un poco diferente. Si estás en Windows, probablemente sea solo el dir D-I-R. Es posible que puedas usar grep. Siempre puedes simplemente enumerar todo lo que hay en tu carpeta para que puedas hacer. O si estás en Windows o ls dash LA, si estás en Mac o Linux. Y tengo un archivo Pip y un bloqueo de punto de archivo Pip. Y lo que este es el PIP file.txt. Y el archivo Pip especifica qué tipo de paquetes están involucrados dentro de este archivo Pip. Ahora, te mostré cuando hago pip instalar Django, que me dio Django. A punto diecisiete. El modo adecuado de hacerlo sería pip. Instalar su acaba de crear un nuevo Pip env. Y dejemos claro eso. Entonces podemos hacer pip install. Django es igual a 3.1 y se está instalando. Ahora, el único inconveniente para Pip es cuando estás instalando cosas, toma un par de segundos más. Ahora en mi opinión, son solo un par de segundos para un agradable entorno virtual, la vida es más fácil de esta manera. Pip es más rápido que Pip lo suficientemente. Algunas personas tienen un problema con eso. Algunas personas no lo hacen. Hagamos Pip env, shell, clear, Pip, show Django. Y ahora tenemos django 3.1 aquí. Y eso lo hicimos desde fuera de nuestro entorno virtual escribiendo pip install y luego el nombre del paquete es igual a la versión. Y de nuevo, lo realmente encantador de esto es que podemos hacer pip N dash, dash r, m, y va a limpiar nuestro PIP. Y para nosotros, toda esta carpeta va a ser borrada así que no estamos desperdiciando espacio en nuestra computadora ahora, si eres como yo y te estás ejecutando en un Mac, tal vez no tengas tanto espacio y quizá quieras eliminar sus entornos virtuales cuando haya terminado con ellos, si son como los entornos virtuales desechables. Yo hago eso todo el tiempo. Ahora personalmente amo a Pippin. A mí me gusta más que un Python Dutch. Y luego punto ven. Ven. Si solo es mucho escribir, también es un poco raro escribir. Sólo porque esto va a usar la versión de Python que está en tu computadora. Ahora, si quisiera una versión de Python diferente en un entorno virtual, podría hacer pip install dash, dash python, y luego la versión de Python que quiero. Y eso va a funcionar para mí. Ahora la otra forma de hacer esto usando diferentes versiones de Python es usar pi n, que es una gran manera de usar diferentes versiones en tu, también en tu máquina. Pero me vinculé a localizar mi proyecto para que todo esté dentro de un entorno virtual. Porque lo que funciona en el sitio Python 3, digamos que 3.4 no va a funcionar necesariamente en 3.9. Y si tengo un proyecto usando Python 3.9, pero mi computadora solo tiene python 3.8. Ah, ahora puedo seguir adelante y usar pip install dash, dash Python 3.9 y ponerlo en marcha. Ahora como poca advertencias, puede que necesites Pi instalado. Si necesitas pi n, puedes ir a ver cómo instalar Python en tu computadora. Va a ser un poco diferente dependiendo de tu sistema operativo. Pero voy a dejar eso en tus manos porque ahora eres un desarrollador avanzado de Python. Esencialmente tú lo que digo es que tienes las habilidades para resolver esto por tu cuenta. Y toda la lección realmente es que hay múltiples formas de hacer múltiples entornos virtuales. Podemos hacer pip, podríamos hacer Python, dash m, entonces podemos usar virtual n, podemos usar docker, podemos usar Vagrant. Podemos utilizar todo tipo de diferentes capas de abstracción. Personalmente me gusta Pip n. Ahora no hay tarea. Yo sólo quería mostrarles esto. Yo solo quiero mostrarles que esta es una opción disponible para que avancen en nuestro próximo, y ni siquiera es una lección. Es nuestro proyecto final. Vamos a estar creando una app bancaria usando clases. 15. Tu proyecto final: Muy bien, bienvenido de nuevo. Sigamos adelante y creemos un proyecto final. Ahora en este proyecto, lo que quiero que creéis es una app bancaria. Y no necesita ser súper complejo, pero sí necesita tener algunos extras en ella. Entonces, en primer lugar, esto debería estar basado en clases. Debe tener métodos en ella para con sorteo y depósito. Y después de cada retiro y cada depósito, quiero que escribas la transacción en un archivo Python. Ahora no cubrimos cómo abrir y escribir en archivos y Python 301, eso fue una cosa de python 201, si creo correctamente. Entonces lo que quiero que hagas es quiero que intentes crear un proyecto que vaya a preguntarle al usuario una y otra vez qué quiere hacer. ¿ Quieren retirarse o quieren depositar, y cuánto quieren hacer? Entonces quiero que hagas un seguimiento de todo eso dentro de una clase llamada banco después de cada transacción, ¿verdad? Esa transacción a un archivo Python. Entonces tenemos un historial de esa transacción, o no sólo de esa transacción, sino de todas las transacciones. Ahora ya no te voy a dar más pistas otra entonces vamos a estar usando la verdadera salvaje. Vamos a estar usando input. Vamos a estar usando clases, métodos, y propiedades. Esto debería hacer sudar a un cerebro. Esto es de esperar que todas las cosas nuevas para ti. Bueno, las clases, los métodos y las propiedades deben ser completamente nuevos para ingresar. Deberías conocer árbol salvaje, debes saber, oh, ¿qué más necesitas? Es necesario conocer sintaxis abierta para administrar archivos. Ya deberías saber esa también. Si no lo haces, definitivamente ve a investigar cómo crear esto. Ahora lo que quiero que hagas es probar esto por tu cuenta. No veas el resto de este video. Te voy a mostrar cómo lo hago. Nunca he construido uno de estos por cierto. Entonces vas a ver todos los errores que tal vez cometa también. Pero si algo aquí es nuevo para ti, no sabes cómo hacerlo, no puedes recordar. Te voy a pedir que no te refieras a otro video. Prueba lo mejor que puedas. Y si te quedas realmente, realmente atascado, Ve a Google, ve a Stack Overflow y busca tu respuesta ahí. Porque el 50% de la codificación está resolviendo problemas y necesitas aprender a resolver problemas por tu cuenta. Si los maestros siempre toman la mano. Honestamente, no vas a aprender. Y quiero que tú como mi estudiante aprendas realmente. No solo nos miraba porque es como estilo editorial, Netflix, ya sabes, quiero que realmente puedas crear una app de Python. Y entonces, ya sabes, tal vez algún día podamos trabajar juntos y ¿qué tan genial sería eso? Así que adelante y crea una aplicación de hornear desde cero. Recuerda que va a tener que pedirle al usuario un retiro y una cantidad o depósito y una cantidad, seguimiento de todo eso. Lo que voy a hacer es desvanecer esto y volver a desvanecerse y les voy a mostrar mi solución. De acuerdo, así que antes que nada, voy a llamar a este proyecto dot pi. Y voy a seleccionar todo eso, comentarlo y usarlo como pauta para lo que tengo que hacer. Entonces lo primero que necesito es algún tipo de aplicación bancaria. Necesito crear una clase llamada banco. ¿ Y cuál va a ser mi cantidad inicial? Bueno, voy a hacer yo sordo init y la cantidad inicial va a ser 0. Eso es lo mucho que voy a abrir esta cuenta con los $0. Usa aquí un flotador, 0.0.0. Self.El saldo de edad es igual a la cantidad inicial. Entonces necesito retirarme y necesito depositar. Tan sordo, con sordo auto monto, voy a tomar ese saldo, equilibrio de auto.edad. Y vamos a subir esto. Self.Equilibrio de edad es igual al equilibrio de auto punto menos la cantidad. Ahora y si esta cantidad es, digamos una cadena por alguna razón. Podemos decir que la cantidad es igual a cantidad flotante. Ahora bien, en realidad no sabemos si esto va a funcionar o no. Y entonces lo que podemos hacer aquí es, oops, ¿qué estoy haciendo aquí? Intenta lanzar eso como la cantidad excepto un error de valor. Y esa cantidad va a ser 0. Y luego vamos a establecer ese New Balance. También queremos hacer depósito. Sordo D posit Cuánto tomaría siempre auto va a tomar una cantidad. Queremos hacer el mismo intento y excepto aquí intentarlo. La cantidad es igual a la cantidad flotante excepto un error de valor. Si no puede lanzar esa cantidad a un flotador y el cambio esa cantidad a 0. El saldo de la auto.edad va a ser el saldo de self.edad más lo que sea que vaya a ser esa cantidad. Entonces o estamos agregando a nuestra cuenta o no agregando nada a nuestra cuenta. Y cuando nos retiramos, o estamos quitando de esa cuenta o no estamos quitando nada de esa cuenta. Hagamos este un paso más pequeño aquí para que podamos ver esto en una sola vista. Y ahora sigamos adelante e instanciemos esto. Hagamos un conteo es igual a banco. ¿ Qué se necesita en su cantidad inicial init? Digamos que voy a abrir esta cuenta con $50 en ella. 50.0050.50. Hagámoslo. Entonces puedo hacer depósito de punto de cuenta. Y digamos que quiero depositar $10 o $10 ahí dentro. Y luego imprimamos mi cantidad total. Saldo de punto de cuenta. Y entonces digamos que quiero retirar 1475, no con coma, sino con decimal. Y vamos a imprimir de nuevo ese saldo de cuenta y sólo asegurémonos de deletrear eso bien. Gracias. Vs Code por mostrarme un error tipográfico ahí. Y abramos una terminal y manejemos esto. Y así empezamos con 50.50, agregamos decenas, obtuvimos 60.5, eso es bueno. Y luego tomamos 14.75. Por lo que 60.5 menos 14.75 es 45.75. Entonces eso parece correcto, y no voy a revisar esas matemáticas. Estoy bastante seguro de que la computadora sabe lo que está haciendo. Y ahora necesitamos agregar registro de transacciones. ¿ Y qué más necesitamos agregar aquí? Y necesitamos pedirle entrada al usuario. Entonces voy a hacer esto. Un paso más pequeño, accidentalmente golpeé el botón equivocado ahí. Un paso más pequeño. Y hagamos otro método en su propia transacción de registro de sordos. Y luego algún tipo de cuerda. ¿ Qué estamos tramitando? ¿ Qué estamos haciendo aquí? Y solo llamemos a esta cadena de transacción. Ahora necesitamos abrir un archivo. Entonces podemos decir ancho, eso es usar un gestor de contexto aquí. Y podemos decir con las transacciones abiertas 2.txt, vamos a anexarlo todo el tiempo o crear un nuevo archivo. Si no existe como archivo, entonces podemos decir file dot, ¿verdad? ¿ Qué queremos escribir? Queremos escribir en la cadena de transacción, y tal vez siempre anexemos una nueva línea al final. Entonces vamos a usar una declaración IF aquí, una declaración F y F String, y lanzar una nueva línea aquí. Y eso viene de la herramienta Python uno, donde aprendimos a lidiar con archivos. Entonces ahora después de cada retiro, simplemente podemos decir si hay una cantidad. Recuerda si 0 es o si la cantidad es 0, esto va a ser falso, por lo que esto no se va a ejecutar. Entonces podemos decir si cantidad entonces hacer una cosa. Self.view, log trends action y esto toma una cantidad, no son una cantidad sino una cadena. Toma la cadena de transacción. Entonces llamemos a esto retirado. Cuántos dólares la cantidad. Hagamos lo mismo con depósito aquí. Y lo que realmente puedo hacer es Doo-doo-doo-doo copiar eso. Y sólo tenemos que asegurarnos de que lo permutemos. Siempre ten cuidado al copiar y pegar. Por lo que podemos decir que el saldo es igual al saldo más lo que sea la cantidad. Siempre que depositamos, registramos esa transacción, no retiramos. Visitamos al depositante, depositamos la cantidad. Y sigamos adelante y abramos nuestros archivos aquí de un lado. Y no vemos transacciones 2.txt. ¿ Es así como lo llamamos? Transacciones punto TXT? Todavía no vemos eso ahí dentro. Adelante y guarda esto y ejecuta esto y ve si hay algún error tipográfico o algo así. Y está bien. Cuco, cuco. Y encabezó cantidad depositada. Hice algo muy mal ahí. ¿Qué hacemos aquí dentro? En primer lugar, esa es una cuerda F. Esto no es JavaScript. Esa es una cuerda F. Esto no es JavaScript. Vamos a seguir adelante y a correr esto de nuevo. Vemos transacciones. Miraremos a ese depositado en $10, retiró 1475. Añadamos también el saldo en año con un nuevo saldo de saldo de autof.edad. Y si hago eso solo un poquito más pequeño aquí podemos ver que un, tengo un error tipográfico y ser que estoy usando una cadena de aplicación. Y de hecho, podemos ponernos más fantasiosos Con esto. Podríamos decir que algo pasó y en lugar de un New Balance, podríamos hacer tabulador, tabulador, saldo de tabulador. Es lo que sea que el auto puntos equilibra. Adelante y despejemos a las transacciones punto TXT. Y vamos a correr esto una vez más. Consultar transacciones en depósito TFC $10 Nuevo Saldo, 60.5, retiró 1475 Nuevos Saldos, 45, 75. Está bien, esto se ve bastante bien. Ahora necesitamos crear un, un bucle de algún tipo para pedir al usuario la entrada una y otra vez. Vamos a cerrar eso. Y tenemos toda nuestra lógica funcionando. Entonces sigamos adelante y envolveremos esto en algo llamado un bucle while. Si bien es cierto. Haz una cosa. ¿ Qué queremos que haga? Nosotros queremos pedir una acción, va a ser insumo. ¿ Qué tipo de acción quieres llevar? Entonces podemos decir, si la acción está en una lista de con Drell o un depósito de depósito o no sé por qué escribí eso, entonces. Haz una cosa. Entonces podemos decir si la acción es igual al retiro, monto va a ser qué tipo de cantidad adeudada queremos insumo. ¿ Cuánto quieres sacar? Y entonces podemos hacer cuenta dot retirar la cantidad. Y no me preocupo por tipear aquí porque lo estamos haciendo aquí. No, ahí no, aquí dentro. Y aquí. Entonces podemos decir otra cosa porque la acción o va a ser retiro o depósito. Si eso va a ser un depósito, cuánto quieres digamos que no sea comida para llevar, sino poner y cuenta punto retiro se va a contabilizar punto deposito d, z la cantidad. Y luego aquí abajo podemos decir imprimir. Tu saldo es saldo de cuenta. Ahora, necesitamos instanciar esto antes de entrar en el bucle while para que no estemos creando una cuenta nueva cada vez que iteramos a través del bucle while. Y vamos a deshacernos de eso y eso, y eso, y eso. Y así ahora tenemos un objeto de cuenta y vamos a retirar o depositar y luego imprimir el saldo. Veamos cómo resulta esto. ¿ Qué tipo de acción quieres llevar? Digamos que quiero depositar. ¿ Cuánto quiero meter? Digamos que quiero poner 13 dólares. Mi saldo ahora es de 6350. Eso es correcto. ¿ Qué tipo de acción quiero llevar? ¿ Y si quiero retirarme? ¿ Cuánto quieres sacar? Digamos 13, 0.5c. Entonces eso nos da un par 50. Y dejemos de fumar con Control C. Oh no, obtenemos un error de interrupción del teclado. Y eso viene de esta línea de acción. Probemos esto. Intenta. Excepto. ¿ Y cómo se llamaba eso? A eso se le llamó error de interrupción del teclado. Pero no, sólo se llamaba teclado, interrupción del teclado. Y vamos a copiar eso. Ahí vamos. Y simplemente vamos a salir de este bucle. Adelante y probemos esto. ¿Qué tipo de acción quiero llevar? Vamos a cancelar. Se. Simplemente nos asesoró para que incluso pudiéramos decir imprimir saliendo del cajero automático. Y pongamos eso en una nueva línea. Y pon eso en una nueva línea. Debido a, debido a lo nuevo, dejemos de fumar. Dice Dejando el cajero automático y una izquierda con gracia usando una excepción de interrupción del teclado. Genial, esto se está juntando bastante bien. Ahora una última cosa que debemos considerar es ¿y si la acción no es retiro o depósito? Hagámoslo. ¿ Qué tipo de acción quiero llevar? Digamos que quiero robar el banco? No va a hacer nada. Esta es una mala experiencia de usuario. Simplemente sigue preguntando, que supongo que no es la peor experiencia de usuario, pero no es una buena experiencia de usuario. Para que podamos comprimir esto o colapsarlo. Y podemos decir otra cosa. Si la acción no es retiro o depósito, ¿qué queremos hacer? Imprimir. Esa no es una acción válida. Inténtalo de nuevo. Ahora hagámoslo. Digamos que queremos robar y no una acción válida. Inténtalo de nuevo, conejo. Ok, ¿y si queremos con empate? Es una palabra difícil de escribir. Con. Raúl sin un espacio al final. ¿ Cuánto quiero sacar? Digamos que quiero sacar 900 dólares. Mi saldo actualmente como menos $849.50. Entonces ahora me estoy metiendo en el sobregiro y si quisieras, podrías extender esto al sobregiro y los préstamos y conocer todo tipo de cosas. Pero eso es esencialmente todo el proyecto en pocas palabras. Y cuando cancelo, se cancela con gracia. No sólo se errora. Dice que me voy del cajero automático. Entonces, recapitulemos cómo se ve esto. Tenemos una clase llamada banco. Cuando abres una cuenta, ¿cuánto vamos a poner ahí por defecto? $0, pongo $50.50 centavos. Para empezar. Cada vez que haya una transacción, vamos a abrir el archivo TXT de las transacciones dot. Vamos a echar un vistazo a eso. Y me está mostrando todo aquí. Eso es genial. Eso es un hacer exactamente lo que quiero que haga. Por cada transacción, ya sea un retiro o depósito, vamos a tomar ese archivo, vamos a escribirle y lo que sea que sea esa cadena de transacción, así que retiró o depositó la cantidad. Tab, tabulador, tabulador balanceado con el saldo ahí dentro. Enfriar, simple registrador de transacciones. Entonces tenemos un método de retiro. Vamos a tratar de lanzar esto como un flotador. Si no podemos lanzar esto como flotador, va a decir que la cantidad es 0. Y si la cantidad es mayor a 0, básicamente lo hará, siempre y cuando no sea 0, podemos tomar algún tipo de acción. Vamos a cambiar automáticamente ese saldo de lo que fuera que fuera actualmente. Entonces abrí con 50.50 y va a menos la cantidad que viene aquí. Y luego vamos a registrar esa cantidad y ese retiro. Por último, tenemos depósito y lo mismo. Vamos a tratar de lanzar esta cantidad como flotador para que podamos hacer matemáticas numéricas sobre ella. Si no podemos va a decir que la cantidad es 0. Si esa cantidad es si ese número es de hecho un número adecuado, si esa cantidad es un número adecuado, entonces podemos cambiar ese saldo para ser balanceado es igual al saldo más cualquier cantidad. Y luego dijimos en nuestro registrador de transacciones, depositamos la cantidad. Por último, creamos una nueva cuenta y después dijimos caminar hasta el cajero automático. Esencialmente eso es lo que esto está diciendo aquí. Si bien algo es cierto, sólo sigue preguntando, sigue preguntando y pidiendo y pidiendo acción. ¿ Qué tipo de acción quieres llevar? Si dijimos Control, si cancelamos, obtenemos un error de interrupción del teclado y simplemente nos vamos a ir, vamos a salir de este bucle. De lo contrario, si la acción está en retiro o depósito, tome medidas aquí. Y si esa acción es retiro, podemos decir cuánto quieres sacar y luego retirar esa cantidad. De lo contrario, si no es retiro, sabemos que va a ser una de estas declaraciones, retiro o depósito. Sabemos que se trata de un retiro. Entonces por lógica de reducción, esto tiene que ser depósito. Entonces decimos que la cantidad va a ser insumo. Cuánto quieres poner por conteos depósito punto a la cantidad que va a funcionar todos sus internos bancarios. Y luego podemos imprimir nuestro saldo saldo saldo de puntos de cuenta. De lo contrario, si alguien está tratando robar el banco o hacer algo más con el banco que realmente no deberían estar haciendo. Vamos a imprimir que no es una acción válida. Inténtalo de nuevo. Después va a ejecutar ese bucle una vez más y va una y otra vez hasta que salgas del cajero automático. Y eso es realmente todo lo que hay a este proyecto en particular. Y estamos haciendo uso de muchas cosas diferentes que aprendimos en Python 301. No necesariamente estamos usando todo, no estamos usando un generador, no estamos usando un decorador. A pesar de que si quisieras, podrías encontrar una manera de sumar esos ahí dentro. Y si quisieras, probablemente podrías convertir transacción registrada en algún tipo de decorador para decorar retiro y depositar con ellos para que no tengamos que escribirla explícitamente aquí. Eso sería bastante genial si pudieras hacer eso. ¿ Y de qué más hablamos? ¿Pip termina? Probablemente deberíamos haber hecho esto en entornos PIP, pero ya sabes, no estamos instalando ningún paquete, así que no necesitábamos un entorno PIP para eso y solo necesitábamos Python regular en nuestras computadoras. Y no usamos un generador porque en realidad no necesitábamos usar un generador. Generador sería realmente bueno si nosotros, estamos dando un bucle a través como un millón de clientes diferentes en nuestro banco y necesitábamos averiguar qué cliente definió. Entonces eso es todo lo que hay a esta aplicación bancaria en particular. Si no le diste una oportunidad a esto y solo ves justo a través de este video. Por favor, adelante y prueba esto. Ahora bien, esto es realmente, realmente importante porque es una gran práctica usar una clase. No olvides si tienes preguntas, siempre puedes unirte al grupo de aprendizaje para codificar en Facebook. Estamos encantados de responder cualquier pregunta de Python que tengas ahí dentro. 16. Resumen de Python 301: Bienvenido al resumen de Python 301. Yo he sido tu maestro. Estás muy orgullosa maestra por cierto, mi nombre es Caleb Eataly y puedes seguirme en Kilo Tolkien en Twitter. O si quieres consejos y trucos de codificación, siempre puedes seguir el punto de codificación para todo el mundo en Instagram. Si alguna vez necesitas ayuda, hay un grupo de apoyo gratuito con decenas de miles de miembros en él llamado aprender a codificar en Facebook. Todo lo que necesitas es una cuenta de Facebook. Es absolutamente gratis. Pasamos horas en su cotidiano arreglándolo para asegurarnos de que haya publicaciones de alto valor ahí dentro y no haya spam en absoluto. Por lo que es un buen grupo al que unirse. Si te gusta. Mi método de enseñanza, no lo olvides, tengo varios otros cursos. Sólo búscame. Mi nombre es Caleb, alto, delgado, y los puedes encontrar en todo tipo de plataformas por ahí, incluyendo YouTube. Gracias por tomar Python 301. Y de nuevo, he sido tu anfitrión y tu instructor, Caleb Colleen, y espero estar trabajando contigo en el futuro ahora que eres un avanzado programador de Python, espero que te hayas divertido y te veré por ahí. Adiós.