Aprende a programar más rápido: programación orientada a objetos en Python | Alvin Wan | Skillshare

Velocidad de reproducción


1.0x


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

Aprende a programar más rápido: programación orientada a objetos en Python

teacher avatar Alvin Wan, Research Scientist

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.

      Introducción

      2:22

    • 2.

      Proyecto

      3:03

    • 3.

      Concepto: paradigma POO

      3:55

    • 4.

      Práctica: helado

      9:54

    • 5.

      (Extra) Práctica: interruptor de luz

      6:10

    • 6.

      (Extra) Misterio: luces sincronizadas

      5:13

    • 7.

      Concepto: abstracción

      5:03

    • 8.

      Práctica: camión de helados

      7:57

    • 9.

      (Extra) Práctica: luces sincronizadas

      6:35

    • 10.

      Concepto: herencia

      4:17

    • 11.

      Práctica: camión de helados de lujo

      4:37

    • 12.

      (Extra) Práctica: luz parpadeante

      4:07

    • 13.

      (Extra) Misterio: MRO

      3:20

    • 14.

      Concepto: herencia +

      5:36

    • 15.

      Práctica: fusión con helados

      5:20

    • 16.

      (Extra) Práctica: luces temporizadas

      5:40

    • 17.

      (Extra) Misterio: clase base frágil

      3:01

    • 18.

      Conclusión

      2:55

  • --
  • 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.

7374

Estudiantes

36

Proyectos

Acerca de esta clase

¿Alguna vez escuchaste el término "Programación orientada a objetos"? ¿Nunca escuchaste hablar de ella, pero quieres mejorar tus habilidades de codificación?

Esta clase cubre un tema imprescindible para todo programador: la programación orientada a objetos (POO). Cubriremos varios conceptos y aspectos a tener en cuenta:

  • El paradigma de pensamiento, para la programación orientada a objetos
  • Un simulador sencillo de un camión de helados usando conceptos de POO
  • Una simulación sencilla de los interruptores de la luz en una casa, también utilizando conceptos de POO
  • Qué son las clases y las instancias
  • Cómo escribir tu primera clase
  • Cómo mantener el código comprensible (abstracción), mantenible (herencia) y flexible (mixins, composición)
  • 1 hora de contenido con lecciones de 5 minutos cada una + 30 minutos de contenido extra

La clase es muy interactiva, ya que programaremos juntos. Al final de esta clase, estarás preparado para escribir y leer código empleando programación orientada a objetos. Y lo que es más importante, mejorarás tu código con una nueva herramienta para organizarlo.

¿Estás interesado en la programación creativa? Consulta mi clase VR101 (AFrame).

¿Te interesa la ciencia de datos o el aprendizaje automático? Consulta mis clases de Programación 101 (Python), SQL 101 (diseño de bases de datos), Datos 101(análisis) o Visión artificial 101(ML aplicado).

Agradecimientos: B-roll en el video introductorio filmado por creadores en Pexels (Anthony Shkraba, Mikhail Nilov, Mart Production, Karolina Grabowska, Vitaly Vlasov, pixabay, pressmaster, Andy Barbour, pavel danilyuk, Roman Odintsov, German Korb, cottonbro)

Conoce a tu profesor(a)

Teacher Profile Image

Alvin Wan

Research Scientist

Top Teacher

Hi, I'm Alvin. I was formerly a computer science lecturer at UC Berkeley, where I served on various course staffs for 5 years. I'm now a research scientist at a large tech company, working on cutting edge AI. I've got courses to get you started -- not just to teach the basics, but also to get you excited to learn more. For more, see my Guide to Coding or YouTube.

Welcoming Guest Teacher Derek! I was formerly an instructor for the largest computer science course at UC Berkeley, where I taught for several years and won the Distinguished GSI (graduate student instructor) award. I am now a software engineer working on experimentation platforms at a large tech company. 4.45 / 5.00 average rating (943 reviews) at UC Berkeley. For more, see my Skillshare or Webs... Ver perfil completo

Level: Intermediate

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. Introducción: Ojalá hubiera conocido este secreto hace mucho tiempo. Ya te lo diré, hay dos formas de crecer como codificador. Una, puedes tomar años para practicar cometer 100 errores por cada principio de codificación que adoptes. Dos, puedes tomar días, incluso horas aprendiendo estos mismos principios de otro codificador. Aquí está el pateador. Una de las cosas más importantes que un codificador senior puede enseñarte son las formas de pensar en el código. Una de esas formas es la Programación Orientada a Objetos, o OOP para abreviar, la salsa secreta para llevar tu código al siguiente nivel. Hola, soy Alvin. En la UC Berkeley, he dado clases a más de 5 mil alumnos. Desde clases de matemáticas discretas hasta aprendizaje automático. Te estaré pasando sabiduría que profesores, ingenieros superiores, y mentores me dieron para que puedas crecer más rápido como codificador de lo que nunca lo hice. En esta clase, aprenderás a pensar críticamente como programador. Este pensamiento crítico te permitirá entonces modelar el mundo que te rodea como una serie de diferentes objetos interactuando entre sí. Este pensamiento crítico también te permitirá calificar código legible, mantenible y flexible. OOP se utiliza en todas partes, para los juegos, para el aprendizaje automático, para la ciencia de datos. Al final de este curso, entenderás por qué y cómo. Podrás imitar en código una tienda de bicicletas procesando reparaciones, un camión de helados gestionando pedidos, o un controlador de tránsito aéreo dirigiendo aviones. Esta clase Coding 101 plus está escrita para principiantes que o están interesados en uno, nivelando su código o dos, frustrados tratando de aprender Programación Orientada a Objetos. Si esa eres tú, no te preocupes. He tenido mi justa parte de confusión en el pasado y espero ayudarte con tu confusión ahora. Tenga en cuenta que esta clase sí espera cierta familiaridad de codificación con Python. Si aún no estás familiarizado, asegúrate de tomar mi curso Coding 101: Python para principiantes para ponerte al día. Tus recuerdos de esta clase no serán sintaxis extraña ni reglas específicas de Python. En cambio, es una forma de pensar. Solo necesitas la intuición para aplicar estos conceptos, aunque olvides cómo se llaman los conceptos. Además de estos conceptos, espero ayudarte a construir confianza; confianza leyendo, escribiendo, hablando de conceptos OOP. Ahora, empecemos a construir con Programación Orientada a Objetos. 2. Proyecto: En esta clase, tu proyecto es construir una simulación usando los conceptos que has aprendido. modo de ejemplos, estarás construyendo un camión de helados gestionando pedidos y un modelo mínimo de interruptores de luz en un hogar. Tu simulación podría ser para cualquier cosa. Un taller de bicicletas que procesa reparaciones, un almacén que procesa envíos a granel, o un controlador de tránsito aéreo que gestiona aeronaves. Escoge el escenario que quieras. Solo asegúrate de que tu escenario tenga muchos tipos diferentes de objetos interactuando. La simulación que construyes es poderosa. En el futuro, puedes agregar una interfaz para convertirla en una app de gestión, usar este sistema para predecir el futuro de un sistema muy complejo o construir un juego con él. En esta clase, no cubriremos las campanas y silbatos, por ejemplo, cómo agregar una interfaz. En cambio, nos centraremos en el núcleo, una serie de objetos interactuando, y en cómo hacer que ese código sea flexible, escalable y mantenible. Esta es una gran manera de entender el poder de la programación orientada a objetos y cómo utilizarla de manera efectiva. Como habrás escuchado de una de mis clases anteriores, mi lema es darte la emoción de aprender más, no necesariamente entregarte una lista de lavandería de diferentes utilidades de Python. Lo mismo aplica en esta clase. Pero aquí también quiero darte la intuición para escribir mejor, código más limpio. Para ello, codificaremos cada concepto, no una sino dos veces. Esto lo haremos específicamente en cuatro fases diferentes. En primer lugar, cubriremos el paradigma OOP, la filosofía y el fundamento de la programación orientada a objetos. En segundo lugar, la herencia, las formas de hacer OOP menos redundante, mejorando la inteligibilidad. Por último, mixins y composición, formas de hacer OOP fácilmente extensible y flexible. Al practicar cada uno de estos conceptos, quiero que se dé una idea de lo que está mal y lo que es correcto en el diseño del código. Olvidar estos términos y definiciones exactos no hará mucha diferencia, lo que quieres es la intuición para escribir más limpio, mejor código. Cada una de las cuatro fases se divide en tres partes diferentes. El 1er parte es el concepto, introduciendo las ideas, términos, y definiciones. El segundo es la práctica. Después usarás estos conceptos en dos ejemplos diferentes. Algunas fases irán acompañadas de una lección de misterio. Esta lección misteriosa abarca un concepto especial de OOP. Estos misterios son bichos reales que los estudiantes han encontrado antes. Espero que estas lecciones puedan ahorrarle algo de dolor y confusión en el futuro. Es posible que hayas oído hablar de otros conceptos de OOP como polimorfismo o encapsulación. Mencioné estos términos brevemente pero no en detalle, ya que creo que el núcleo de OOP radica en los términos que vamos a cubrir, abstracción, herencia, mixins, y composición. Hay un gran número de lecciones, pero he diseñado cada lección para que sea relativamente corta y tamaño bocado para que esperemos que puedas tomar cada una de estas lecciones sobre la marcha, en tu viaje, en el descanso del baño, en cualquier momento realmente. Espero que estés emocionado por empezar a construir tu simulación. Empecemos. 3. Concepto: paradigma POO: En esta lección, presentaré el paradigma de programación orientada a objetos. No habrá ningún código en esta lección. El objetivo es simplemente introducir la forma de pensar de OOP. Cubriremos tres conceptos en esta lección. El 1er concepto es la diferencia entre una clase y una instancia. Aquí tenemos un helado de plantilla. Posteriormente, hablaremos de lo que realmente contiene esta plantilla. Por ahora, piensa en esta plantilla como tu expectativa de un helado. Esperas poder comerlo, esperas una cucharada de helado y un cono de helado, y tal vez esperas sabor a vainilla por defecto. No obstante, esta plantilla, tu expectativa es imaginaria. Aquí tenemos una verdadera porción de helado que puedes comer. Observe que puede generar múltiples porciones a partir de una sola plantilla. También advierte que puedes comer cada porción a diferentes tarifas. A una porción le puede quedar una primicia y a la otra puede que no le queden primicias. Ahora vamos a renombrar plantilla y servir. En lugar de plantilla, llamaremos a esto una clase. La clase de helados es tu expectativa de un helado, lo que contiene, y cómo puedes interactuar con él. Vamos a diseccionar esto con más detalle en el siguiente apartado. En lugar de servir, llamaremos a estas instancias. Una instancia de helado es un helado real que puedes comer. Al igual que antes, observe que puede generar múltiples instancias desde una sola clase. También puedes comer cada instancia a un ritmo diferente. Una instancia puede tener una primicia a la izquierda y la otra puede que no le queden primicias. En terminología OOP, decimos que hemos definido la clase de helados. En esta lección, te daré varios bloques de construcción fundamentales para cómo diseñar estas clases. Empezaremos con definir métodos. En esta sección, hablaremos de los métodos de clase. En realidad usamos métodos en Coding 101 Python para principiantes, pero en esta clase, estaremos definiendo métodos. Para entender método, volvamos a nuestro ejemplo de helados. Los métodos nos ayudan a definir qué puedo hacer con el helado. Bueno, podemos comer y agregarle primicias a nuestro helado, y eso es todo. Estas dos acciones son nuestros métodos. Codificaremos estos métodos más adelante. En terminología OOP, diseñamos nuestra clase de helados para incluir los métodos de comer y agregar cucharada. Nuevamente, diseñamos nuestra clase de helados para incluir el comer y agregar métodos de cucharada. Eso concluye métodos. Pero ahora, ¿cómo implementamos estos métodos? Bueno, cada una de nuestras instancias de helados necesita saber cuántas primicias quedan. Eso nos lleva a atributos. Los atributos son piezas de información. Primero nos centraremos en la información que es específica de una instancia o una porción de helado. Volver a nuestro ejemplo de helados, ¿qué información es específica de cada instancia de helado? En primer lugar, el número de bolas que quedan puede diferir entre instancias de helados. En segundo lugar, el sabor del helado puede diferir entre instancias de helados. En terminología OOP, diseñamos nuestra clase de helados para incluir los métodos de comer y agregar cucharada. También incluye atributos para el número de bolas que quedan y el sabor del helado, y eso es todo. Estos son los bloques de construcción de la programación orientada a objetos. Para recapitular, cubrimos la diferencia entre clases o plantillas e instancias. También discutimos la regla de los métodos que describen cómo interactuar con una instancia. Mencionamos atributos que contienen información sobre una instancia. Sé que hubo muchos términos en esta lección, pero no te preocupes, seguiremos usando estos términos una y otra vez en las próximas lecciones. Al final de esta clase, estarás harto de escuchar las palabras clase, instancia, método y atributo. Pero también entenderás estos términos mucho más profundamente. Para una copia de estas diapositivas y más recursos, asegúrate de consultar la página web del curso. Esto concluye nuestra lección, el Paradigma de Programación Orientada a Objetos. En la siguiente lección, comenzaremos a simular un camión de helados usando estos conceptos. 4. Práctica: helado: En esta lección, escribiremos nuestra primera pieza de código usando programación orientada a objetos. Comience navegando a repl.it/languages/python3. Sugiero pausar el video aquí y crear una cuenta si aún no lo has hecho. tanto que puedes codificar sin una cuenta, una cuenta te permite guardar tu código. Entonces, sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. De esa manera, puedes codificar junto a mí. El primer paso es definir tu primera clase. Aquí está cómo. Se requiere cualquier personaje en negro. Debe ser mecanografiado exactamente de esa manera. Empezamos con la palabra clave class en negro, luego agregamos el nombre de clase denotado en azul. Al igual que muchos otros conceptos de Python que has aprendido, agrega dos puntos, luego agrega dos espacios y por ahora, usa pase. Pass es solo un marcador de posición para otro código que escribiremos más adelante. Vamos a codificar esto ahora. En esta lección, crearemos una clase de helado. Usemos el formato que vemos a la izquierda, escriba en clase, IceCream. Golpear colon. Una vez que escribas Enter, Repl.it creará automáticamente dos espacios para ti. Ahora, teclea en pase. Voy a golpear a Escape para despedir este modal. Eso es todo para tu muy primera clase. Usemos esta clase ahora para crear una instancia. Llamamos a este proceso de creación de una instancia a partir de una instancia de clase. A continuación se muestra cómo instanciar. instanciación es realmente solo la mitad correcta de este formato, escribe el nombre de la clase en azul, luego agrega dos paréntesis, y eso es todo lo que necesitas para instanciar. También asignaremos esta instancia de la derecha a una variable de la izquierda. Al igual que con definir cualquier otra variable, tenemos el nombre de la variable en rosa a la izquierda, un signo igual negro con espacios opcionales y luego el valor. En este caso, el valor es la instancia. Vamos a codificar esto ahora. Antes de comenzar, asegúrate de ejecutar tu archivo pulsando “Ejecutar”, la flecha verde en la parte superior. A continuación, utilizaremos el prompt interactivo para probar nuestro código. Es posible que su mensaje interactivo esté en el lado derecho de su pantalla. He cambiado el diseño para que el mío esté en la parte inferior. En primer lugar, escriba su nombre de variable y, a continuación, instancie escribiendo el nombre de su clase y los paréntesis. Veamos ahora qué contiene el helado variable y el contiene nuestra instancia o nuestro objeto. El siguiente concepto es un método. Ahora agregaremos una acción o comportamiento a nuestra clase. Esto es lo que tenemos hasta ahora. Para agregar un método, simplemente definimos una función dentro de la clase. Esto debería parecer familiar, la palabra clave def que hemos visto antes. Utilizamos def para definir funciones también. La única diferencia es que nuestro primer argumento al método debe ser auto denotado aquí en negro. Aquí, tenemos el nombre del método en azul, el contenido del método en naranja, y los espacios en gris. Vamos a codificar esto ahora. Dentro de tu editor, ahora vamos a eliminar este pase y añadir el método de comer, así que def come auto colon, igual que vemos en el lado izquierdo. Ahora, vamos a escribir en letra impresa, y voy a escribir Yum. Eso es todo por definir tu método de comer. Ahora probemos o usemos este método. Para probar o utilizar este método, utilice las expresiones de punto recuperadas en el curso de Python para principiantes, escriba el nombre de la variable de instancia, que es hielo en nuestro ejemplo, agregue un punto que se muestra en negro, luego agregue el nombre del método en azul. Por último, usa dos paréntesis para llamar realmente al método al igual que llamamos funciones. Vamos a codificar esto ahora. Nuevamente, no olvides ejecutar el archivo haciendo clic en la flecha verde. En primer lugar, instanciar, por lo que helado equivale a IceCream con paréntesis. Entonces, llama al método de comer. Usaremos la plantilla del lado izquierdo, helado, nuestra variable nombre.eat. Hit Enter y obtenemos Yum, que es nuestra declaración de impresión en el cuerpo del método eat. Ahora, introducimos un concepto llamado el constructor. El código en el constructor se ejecuta cuando se crea una instancia de la clase. Permítanme mostrarles con el ejemplo. Aquí hay un constructor de ejemplo. Observe que la primera línea es todo negra. Debe copiar eso exactamente por ahora. Como siempre, puedes colocar el código que quieras en naranja en el cuerpo del método. Aquí, nuestro constructor simplemente imprime alto. Vamos a codificar esto ahora. Vamos a añadir un constructor a nuestra clase de helados. Aquí, tendremos def_init_self colon, igual que vemos del lado izquierdo ahí, y luego vamos a imprimir algo memorable. En este caso, diremos imprimir Helado creado. Voy a añadir una línea de parpadeo aquí sólo para mantener nuestro código limpio y legible. De nuevo, ejecuta tu archivo golpeando la flecha verde. Ahora vamos a instanciar nuestra clase de helados, helado es igual a IceCream y aquí, puedes ver Helado Creado. Ahora, para nuestro concepto final, un atributo. Asignar un atributo es muy similar a definir una variable. Aquí, tenemos el nombre del atributo en rosa y el valor en naranja. Observe, sin embargo, que tenemos el self. en negro. Esto es importante. Es así como adjuntamos el atributo a la instancia de hielo actual. Self siempre se referirá a la instancia actual. Vamos a codificar esto ahora. Eliminar el contenido de un constructor. En cambio, vamos a añadir self.scoops igual a 3. Esto asigna el número de scoops a tres. Vamos a probar esto. Ejecuta tu archivo haciendo clic en la flecha verde en la parte superior. Entonces, instancie tu clase de helados. Consulta el número de scoops. Aquí, tendremos la instance.scoops. Aquí, tenemos tres como se esperaba. Esa no fue la última parte de la lección. En realidad tenemos dos fragmentos más de código para revisar. Cambiemos nuestro método de comer para dar cuenta de la cantidad de primicias que se comen. Esta fue nuestra definición de método anterior con el nombre del método en azul y el contenido del método en naranja. Ahora, agregamos un argumento en verde. Podemos entonces usar ese argumento de entrada verde, en este caso, y en nuestro método. aquí usamos y para computar y tiempos y. también tenemos el nombre del método en azul, el contenido del método en naranja y espacios. Vamos a codificar esto ahora. En nuestro método de comer, añadiremos un argumento de entrada llamado scoops. Esto permitirá al usuario de helados comer sin importar cuántas primicias les gusten a la vez. Ahora, actualicemos el número de primicias que le queda el helado. En lugar de imprimir Yum, agrega self.scoops igual al total original, pero menos el número de primicias que deseamos comer. También voy a introducir otra forma de escribir esta línea de código que es mucho más corta. También podemos reemplazar esto por self.scoops menos igual a scoops. Estas dos líneas son exactamente las mismas, así que voy a borrar la primera aquí. Esta línea dice disminuir el número de scoops por el número de scoops que deseamos comer. Repasemos cómo llamar a un método. De izquierda a derecha, tenemos el nombre de la variable de instancia en rosa, un punto, y el nombre del método en azul luego el argumento de entrada en verde. Probemos esto ahora. Adelante y haz click en el botón verde en la parte superior para ejecutar tu archivo. Entonces, teclear helado es igual a IceCream. Eso instancie. Entonces, vamos a comprobar cuántas primicias se encuentran actualmente contenidas, que son tres. Entonces, vamos a comer o llamar al método de comer con el argumento dos como vemos en el lado izquierdo. Esto se comerá dos primicias, y vamos a comprobar cuántas primicias quedan. Tenemos una primicia como se esperaba. Eso concluye nuestros fundamentos para escribir código de programación orientado a objetos. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Tal vez estés pensando: “Vaca santa, hay muchos términos nuevos. Eso es bastante abrumador”. Si esa eres tú, no te preocupes. Yo también estuve ahí en algún momento. Siéntase libre de saltar a la siguiente lección, que es la práctica para seguir construyendo familiaridad con estos términos de OOP. Alternativamente, si te interesan algunos problemas de práctica de bonos desafiantes, continúa con la lección. Ahora, a nuestra práctica de sección de bonos. Practicemos usando la terminología en esta lección agregando dos fragmentos de código más. En primer lugar, para revisar, este método de comer toma un argumento de primicia y resta esas muchas primicias del número total de scoops. Ahora, para practicar, crea un método llamado add que toma un argumento scoops y agrega que muchas scoops al total. Pausa el video aquí y prueba esto ahora. Si no sabes por dónde empezar, está bien. Conseguirás esto con más repetición. Ahora vamos a escribir el método, añadir. Justo debajo de nuestro cada método, definiremos add. Nuevamente, el primer argumento es siempre el yo. A continuación, agregue el argumento scoops. Deberíamos entonces agregar ese número de primicias al total. Esto concluye nuestro método de adición. Practicemos otro. Esto pondrá a prueba tus conocimientos de la clase 101 de codificación Python. Tiempo para revisar si las declaraciones si las has olvidado. En el método eat, comprueba si el número de scoops que quedan es menor que el número de scoops que el usuario está tratando de comer. Si es así, imprima no suficientes bytes que quedan; no ser así, deduzca el número de scoops del total como de costumbre. Nuevamente, pausa el video aquí para intentarlo. Si no sabes hacer esto, no te preocupes. Con más práctica vendrá más familiaridad. Ahora, aumentemos nuestro método de comer. Vamos a comprobar si el número de scoops es menor que el número de scoops que el usuario está tratando de comer. Si es así, imprimir no quedan suficientes bytes. De lo contrario, deducir un número de scoops en total como de costumbre. Eso concluye nuestro método de alimentación aumentada. Eso es todo para esta lección. Nuevamente, en la siguiente lección, tendremos alguna práctica para seguir construyendo familiaridad con estos términos de OOP. 5. (Extra) Práctica: interruptor de luz: Bienvenido a la práctica de bonos. En esta lección, crearemos una simulación para una serie de luces. Al igual que antes, navega a repl.it/languages/python3. Entonces sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. En primer lugar, es cómo debes definir tu clase. Tenemos la palabra clave class en negro, nombre de clase en azul, colon, dos espacios y el cuerpo de la clase en naranja, que es el positor de pase por ahora. Vamos a codificar esto. En esta lección, simularemos un interruptor de luz. Entonces llamemos a nuestra clase Luz. Luz de clase: “Enter”, lo que creará dos espacios para nosotros y seguirá adelante y tecleará “Pase”. Ahora vamos a crear una instancia de nuestra clase o crear una instancia de nuestra clase. En el lado derecho, tenemos el nombre de la clase en azul y paréntesis en negro. Eso es todo lo que necesitamos para instanciar la clase. No obstante, debemos asignar esta instancia a una variable. Tenemos el nombre de la variable en rosa, igual signo en negro con espacios opcionales y el nombre de la clase en azul. Ahora vamos a codificar esto. Adelante y golpea la flecha verde en la parte superior para ejecutar tu código. De nuevo, ahora vamos a teclear a nuestro intérprete. Para ti, tu intérprete puede estar en el lado derecho de tu pantalla, mío está en la mitad inferior. Ahora vamos a definir la variable que es ligera, y el nombre de la clase con paréntesis para instanciar. Veamos qué contiene la variable light y contiene una instancia o un objeto. Añadamos ahora la capacidad de activar y desactivar la luz. Aquí está la clase en nuestro ejemplo, y aquí está el método add. Tenemos la palabra clave def en negro, nombre del método en azul y el cuerpo del método en naranja, junto con los espacios en gris. Ahora vamos a definir un método toggle usando este formato. Reemplaza la palabra clave pass y en su lugar escribe def toggle de nuevo con el argumento self e imprime “¡Activar y desactivar!”. Voy a golpear a “Escape” para despedir a este modelo. Ahora, deberíamos ver cómo probar este programa. Estas son las expresiones de puntos que has visto antes. Tenemos el nombre de variable de instancia en rosa, un punto en negro, el nombre del método en azul y los paréntesis en negro otra vez. Estos paréntesis son necesarios para codificar el método. Ahora probemos este programa. En primer lugar, ejecuta el código haciendo clic en la flecha verde en la muy, muy arriba. Instancia tu luz, luego llama al método toggle, light.toggle y aquí obtenemos nuestra declaración de impresión. En esta siguiente sección, vamos a cubrir el constructor. Aquí un ejemplo de constructor con la primera línea completamente en negro y el cuerpo del constructor en naranja. Tenemos la expresión aquí y los espacios en gris. Ahora agreguemos un constructor. Vamos a definir init con el auto argumento y luego vamos a imprimir “Creando luz”. Al igual que antes, voy a añadir un espacio para la legibilidad. De nuevo, ejecuta tu código haciendo clic en la flecha verde en la parte superior y escribe “Luz igual a Luz” para crear instancias. Aquí, obtenemos la declaración impresa que escribimos antes. Ahora vamos a agregar atributos para rastrear el estado interno de la luz, ya sea encendido o apagado. Este es el formato para definir atributos. Tenemos un auto punto en negro, el nombre del atributo en rosa y el valor en naranja. El auto siempre se refiere a la instancia actual. Vamos a codificar esto ahora. En primer lugar, en el constructor, configuramos On en False. Entonces dentro del método toggle, vamos a comprobar si la luz está actualmente encendida. Entonces si self.on: entonces ponemos la luz False y si actualmente no está encendida, entonces la encendemos. En realidad podemos resumir rápidamente estas cuatro líneas de código usando sólo una línea de código escribiendo en self.on es igual a no self.on. Si self.on es cierto, no verdadero nos dará falso. Si self.on es cierto, no verdadero nos dará falso. Por lo que no nos permite simplemente cambiar entre verdadero y falso. Nuevamente, esta línea es exactamente la misma que estas cuatro líneas. Eliminaré estas primeras cuatro líneas y este es nuestro método de alternancia. Ahora probemos nuestro código. De nuevo, pulsa la flecha verde para ejecutar tu código y vamos a instanciar nuestra luz. Vamos a comprobar si está encendida o no. Actualmente no está encendido. Cambiemos la luz y comprobemos si está otra vez encendida y de hecho está encendida. Nuestro código funciona. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Eso concluye nuestra lección de práctica. Espero que te estés sintiendo de alguna manera familiarizado con la terminología hasta ahora. No hace falta memorizar los formatos que hemos cubierto. En primer lugar, siempre se puede buscar hacia arriba. Segundo, en virtud de ver repetidamente estos formatos una y otra vez, al final de este curso, estarás más familiarizado con ellos de lo que estás ahora. En la siguiente lección, visitaremos un bicho misterioso y cómo solucionarlo. Si quieres practicar con problemas más desafiantes, sigue viendo esta lección para una práctica. Al igual que en la última lección, ahora tenemos una práctica de bonos. Crea un método llamado is_on que devuelve si la luz está encendida o no. Pausa el video y pruébalo ahora, y aquí está la solución. Vamos a añadir otro método dentro de la clase Light llamado is_on. De nuevo, necesitas tu auto argumento, y simplemente vamos a devolver soft.on. Voy a golpear “Escape” para descartar este modelo y seguir adelante y ejecutar tu código haciendo clic en la flecha verde. Voy a instanciar la luz y aquí vamos a comprobar, está la luz encendida escribiendo light.is_on. Asegúrate de codificar tu método con paréntesis y de hecho es falso. Ahora, cambiemos la luz para que esté encendida y comprobemos, ¿está encendida? En efecto, esto es cierto. Nuestro método funciona. Como dijimos antes, esto concluye nuestra lección y en la siguiente lección, visitaremos un bicho misterioso y cómo solucionarlo. 6. (Extra) Misterio: luces sincronizadas: En esta lección, cubriremos un bicho misterioso y cómo solucionarlo. Tenga en cuenta que estos misterios abordan algunas de las partes más confusas de OOP. Si te sientes abrumado, sugiero saltarte estas secciones misteriosas en el primer pase, revisitarlas en un segundo pase al curso. Al igual que antes, navega para responder.it/languages/python3. Entonces sugiero colocar sus ventanas Skillshare y repon.It lado a lado como se muestra aquí. En primer lugar, es la clase. Trata de crear una clase llamada Luz. Pausa tu video aquí si no quieres una pista. Aquí está ahora su pista. Este es el formato para una definición de clase. Ahora escribamos la solución. Vamos a definir una clase Luz. Para este siguiente paso, vamos a instanciar estas Luces. Instanciar las clases de Luz dos veces, nombrar tus instancias a y b Pausa tu video aquí si no quieres una pista. Ahora, aquí está su pista. Este es el formato para la instanciación y la asignación de la instancia a una variable. Ahora escribamos la solución. Está bien si no sabías qué escribir. Aquí, vamos a escribir en a es igual a Luz y b es igual a Luz. A continuación, permítanme presentar una nueva forma de definir un atributo para su clase. Aquí está tu clase. Vamos a definir lo que se llama el atributo de clase definiendo una variable en el cuerpo de esta clase. Ahora actualicemos nuestro código Light. En lugar de un pase que vamos a escribir aquí en es igual a False. Para acceder a este atributo de clase, podemos hacer referencia directamente a la clase y su atributo mediante el uso de una expresión de punto. Golpea la “flecha verde” para ejecutar tu código. Ahora, vamos a usar al intérprete. El intérprete para mí está en la mitad inferior de la pantalla, pero quizá en el lado derecho para ti. Adelante y teclee el nombre de clase.on. Podemos ver que el valor predeterminado es False como definimos aquí. Tenga en cuenta que si define una instancia, también puede acceder a este atributo. Por ejemplo, si tecleamos una.on obtendremos False y b.on también será False. Ahora es hora de que introduzcamos el misterio. Intentemos modificar uno de estos atributos de Luz. Anteriormente, modificamos estos atributos en un método. Podemos modificar los valores de atributo fuera de los métodos también. Cambiar Luz a para estar encendida. Podemos establecer una.on igual a True. Como era de esperar si revisamos una.on, obtenemos Verdadero. Ahora, ¿qué crees que le pase a Luz b , aún debería estar apagado. Podemos comprobar para averiguar que la luz b está efectivamente apagada. Ahora, es hora del misterio. Cambiemos el atributo de clase a True. Aquí escribiremos en Light.On es igual a True. Ahora bien, ¿qué crees que le pase a la Luz b? Todavía debe estar apagado, podemos comprobar, pero la luz.B está encendida. ¿Qué pasó aquí? Tenemos que visualizar para entender lo que pasó. Empezamos definiendo el atributo de clase Light para estar apagado. Después definimos una nueva instancia como se esperaba, esta nueva instancia sigue apagada. Después cambiamos el atributo de clase a True para que el valor predeterminado esté activado. Esto es lo que esperábamos que sucediera. Esperábamos que la Luz instanciada no se vea afectada. No obstante, vimos que la Luz instanciada se vio afectada. También estaba encendido, que es justo aquí, b.on también era Verdadero. Esto es lo que realmente sucedió. Definimos el atributo de clase Light, que está apagado por defecto. Cuando instanciamos a la Luz, la Luz no tenía su propio atributo para encendido o apagado. En cambio, la instancia Light aún tenía un atributo de clase. Como resultado, cuando cambiamos el atributo de clase, también cambiaron las instancias en atributo. Comida para llevar es que los atributos de clase siempre se comparten. Ahora exploremos otro misterio. Ahora vamos a establecer Light.On es igual a False. ¿ Qué crees que le pase a la Luz b, como es de esperar? b también ahora es Falso. ¿ Qué crees que le pasó a Light a? Si escribimos una.on, Light a en realidad sigue encendida. ¿ Qué? ¿De qué manera Light a escape el atributo compartido? Vamos a descomponer esto con otra visualización. el lado izquierdo, nos hemos imaginado lo que creemos que pasó. Tenemos la clase en negro y las dos instancias a continuación. Como aprendimos en la sección anterior, los atributos de clase se comparten. Usemos flechas en su lugar. Antes, en realidad encendimos la luz a de forma manual. En este caso, establecer el atributo directamente convierte el atributo de clase en un atributo de instancia. luz a ahora está desacoplada y tiene su propio estado. A continuación, establecemos el atributo de clase en True y volvemos a establecer el atributo de clase en False. Todo el tiempo, Luz a permanece encendida y no se ve afectada. Para llevar es que los atributos de clase se comparten pero los atributos de instancia no lo son. Esto también nos lleva a una propina para evitar esta confusión. El consejo es no modificar los atributos de clase en su programa. Esto te salvará el dolor de cabeza que ilustramos. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye la lección. En la siguiente lección introduciremos un nuevo concepto. 7. Concepto: abstracción: Bienvenido a otra lección conceptual, la abstracción. No habrá ningún código en esta lección. En cambio, discutiremos un concepto de programación orientado a objetos llamado abstracción, que mejora la legibilidad y mantenibilidad de tu código. Permítanme explicar qué abstracción está usando nuestro ejemplo de helado. Esta es nuestra diapositiva de antes. Aviso hemos delineado las expectativas de cualquier instancia de helado que encontremos. Para cualquier instancia de helado, sabemos lo que hace la instancia de helado y cuáles son los datos que tiene cada instancia de helado. Por ejemplo, podemos comer una instancia de helado. Pero lo que es más importante, podemos comer una instancia de helado sin saber cómo se implementa el método de comer. La última parte es clave. Como usuario de instancias de helados, podemos abstraer e ignorar cómo funcionan estos métodos. Sólo necesitamos una descripción aproximada de lo que hace el método. A esta noción de abstracción de detalles se le llama abstracción. Para repetir esa definición de manera más sucinta, la idea de abstracción es eliminar detalles innecesarios para el usuario. En nuestro ejemplo, el usuario es el comedero de helados. El que come sabe que puede comer el helado o agregar las primicias. Se abstraen los detalles innecesarios como maneja el helado comer. Esto mejora la legibilidad de tu código. Ahora vamos a discutir qué se esconde la abstracción. ¿ Cuál es esta información innecesaria? Esta siguiente sección ejemplifica un concepto relacionado llamado encapsulación. En el centro tenemos nuestros dos métodos comer y agregar. A la derecha en azul tenemos descripciones de métodos para usuarios externos que cada método permite a los usuarios comer hasta que no quede más helado. El método add permite a los usuarios externos agregar más helado. A la izquierda en rojo, tenemos el funcionamiento interno de cada método internamente o mantenemos cuenta del número de scoops que quedan. No es demasiado sorprendente, comer simplemente resta una cucharada, y agregar simplemente agrega una cucharada, los detalles internos rojos están ocultos lejos de los usuarios externos. Para hacer cumplir esto, usamos encapsulación. No enfatizaremos demasiado la encapsulación. Tan solo sepan que en encapsulación implica restringir el acceso a la información interna, como hacer cumplir que las scoops no pueden ser modificadas por los forasteros. En alguna encapsulación oculta información al usuario. Si estás confundido acerca de la diferencia entre abstracción y encapsulación, está bien. No saber la diferencia incluso después de completar este curso está bien. uso de la abstracción y encapsulación, cualquiera que sea, es la parte importante. Ahora discutiremos un beneficio de la abstracción, que es eliminar la redundancia en el código. Esta eliminación de redundancia es cómo abstracción realmente mejora la mantenibilidad de su código. Así es como la abstracción elimina la redundancia. A la derecha, tenemos un cono de helado. Es compatible con el método add, que agrega una cucharada de helado. A la izquierda, tenemos un camión de helados. Tiene sentido que al pedir desde el camión de helados, también teníamos una cucharada de helado. No obstante, ¿y si queremos modificar scoop agregando comportamiento? Ahora, sólo podemos agregar una primicia, si el número total de scoops es menor a tres. También tenemos que añadir esta restricción dondequiera que agreguemos una cucharada de helado, como en el camión de helados. A continuación, ¿y si añadimos otra modificación? Si no quedan scoops, agrega tres scoops a la vez. También tenemos que añadir esto dondequiera que agreguemos una cucharada de helado, como en el camión de helados, esto rápidamente se convierte en una pesadilla de mantenimiento. Aquí te explicamos por qué. ¿ Qué sucede cuando estas dos copias de scoop agregando código salen de sincronía? Entonces, el helado empieza a comportarse de formas inesperadas. Podría tener un poco de helado con más de tres primicias, por ejemplo. Estos comportamientos inesperados son los que causan errores en la producción, así que ten cuidado. Pero, ¿cómo arreglamos esto? Solo queremos una copia del código de adición de primicia. Sencillamente, cualquier código que agregue helado debe llamar al método de agregar clases de helado. Nadie más debe modificar directamente el número de primicias en un cono de helado. Hacer cumplir esta abstracción nos permite reducir la redundancia en el código. Tip. Compruebe si hay código redundante. Si tu copia pega o escribe código redundante, lo estás haciendo mal. Explicaremos por qué y cómo cuándo empezamos a codificar. La abstracción elimina información innecesaria. Por ejemplo, no necesitas saber cómo funciona comer helados para llamar al método de comer. Esto mejora la legibilidad de tu código, haciendo que sea más fácil y rápido de entender. La encapsulación oculta o restringe el acceso a la información. Por ejemplo, no se puede acceder al número de cubitas de helado que quedan directamente. Por último, la abstracción elimina redundancia y código, resta también mejora la mantenibilidad de su código. No olvides la abstracción. Aquí te presentamos un resumen de los conceptos que hemos cubierto hasta ahora. Para una copia de estas diapositivas y más recursos, asegúrate de consultar la página web del curso. Esto concluye nuestra lección, la abstracción. En la siguiente lección, simularemos un camión de helados que implemente correctamente la abstracción. 8. Práctica: camión de helados: En esta lección, practicaremos la abstracción creando una clase de camión de helados. Una vez que veas esta página, culpa al proyecto para obtener tu propia copia editable. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable, haga clic en los puntos suspensivos para obtener otro desplegable, y finalmente, haga clic en el botón Tenedor. Entonces sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. Deberían entonces ver código similar a los que veo a la derecha. Si te desplazas hacia abajo, verás la clase de helado que escribimos en la última lección. El primer paso es modificar nuestra funcionalidad add scoops. Si tenemos más de tres primicias, nuestro helado debería derrumbarse, dejándonos con cero primicias. Dentro de nuestro método add, primero debemos comprobar si hay más de tres scoops. Aquí escribiremos si self.scoop es mayor que tres, luego establece el número de scoops a cero. También vamos a agregar aquí una declaración de impresión para explicar lo que le pasó al usuario. Aquí imprimiremos: '¡ Demasiadas primicias! Helado caído. ' Antes de seguir adelante sin embargo, aquí hay un consejo. Evita los números mágicos. Los números mágicos son cualquier número escrito directamente en el código como este tres y esto es cero. Los ceros son lo suficientemente simples como para razonar, pero ¿por qué tres? Sabemos que tres es el máximo número de scoops. Pero en programas más complejos, los números mágicos se vuelven más difíciles de entender para otros codificadores. En cambio, deberíamos reemplazar estos tres por una variable llamada max scoops, que tiene el valor tres. Hagámoslo ahora. Para nuestra variable, definiremos un atributo de clase llamado max scoops. Hagámoslo ahora en código. Dentro de tu clase de helados, vamos a definir max scoops igual a tres. Entonces podemos usar este atributo de clase a continuación en lugar del número 3. Aquí vamos a escribir en lugar del número 3 en el método add, self.max scoops. Ahora usemos esta clase de helados y veamos cómo respetar la abstracción en la práctica. Haga clic en la flecha verde en la parte superior para ejecutar su archivo. Ahora, instanciad vuestro helado. Entonces digamos que queremos agregar scoops, podemos modificar directamente el número de scoops, helados.scoops más igual a dos. Pero recuerda, queremos establecer el número de scoops a cero. Si superamos las tres primicias, podríamos empezar a codificar esto. Si las bolas de helado son mayores que tres, pero esto debería parecer familiar. Acabamos de escribir este código en el método add, esta familiaridad, esta redundancia, debería ser una bandera roja. Además, no deberíamos estar modificando directamente el atributo scoops. No estamos siguiendo apropiadamente la abstracción. Entonces, en cambio, deberíamos estar usando el método add que ya escribimos. Aquí en su lugar deberíamos estar escribiendo helado.add (2) y aquí notaremos que nuestra funcionalidad realmente patea. Tenemos más de tres primicias en el helado ahora, así que nos volcamos y sólo tenemos cero scoops. Podríamos repetir el mismo error. Digamos que desea disminuir el número de scoops. Podríamos escribir helados. scoops menos igual a tres. Pero entonces espera, queremos comprobar si quedan suficientes scoops antes de restar. Entonces podemos teclear, 'Si helado.scoops menos de tres”, y de nuevo, deberían parecer familiares. Acabamos de escribir esta lógica en el método comer. Esta es nuestra bandera roja. Deberíamos usar el método de comer. En lugar de escribir esto, ahora escribiremos helado.eat (3). Esto nos dará, no quedan suficientes mordidas. Tip, comprueba si hay código redundante. Si estás copiando pegando o escribiendo código redundante, probablemente lo estés haciendo mal, y aquí te explicamos por qué. Tener código redundante dificulta el mantenimiento del código. Específicamente, es posible que una actualización de una copia no se propague a la otra copia de ese código. Después tienes copias de código divergentes lentamente que ambos intentan hacer lo mismo, así que comprueba si hay código redundante, asegúrate de respetar la abstracción. Ahora esbozaremos una nueva clase de camión de helados. A modo de refresco, aquí está el formato. Defina su nueva clase con el nombre de la clase, dos espacios y pase para el cuerpo de la clase. Vamos a definir un camión de helados clase y pasar por ahora. Después define tus métodos. Necesitarás un pedido de método para que los clientes puedan pedir sus conos de helado. Para este método, necesitamos saber cuántas scoops agregar inicialmente. Elimine “Pase” y ahora agregue “Order” con el argumento auto y el número de scoops para agregar inicialmente. Nuevamente, escribiremos en pase y llenaremos el cuerpo de nuestro método más adelante. También tendremos un segundo método llamado add, que los clientes puedan pedir recargas para sus conos de helado. Para este método, necesitamos que el helado agregue dos y cuántas primicias agregar. Defina el método add, pero el auto argumento, y luego el helado a agregar y el número de scoops a agregar. De nuevo, usa pase y rellenaremos el método más tarde. Ahora empecemos la clase de camiones de helados. Dentro del método de pedido crearemos una nueva instancia de helado. Aquí tenemos helado igual a una nueva instancia de helado. Ahora vamos a agregarle primicias. Hemos aprendido nuestra lección de antes, usaremos el método add de helado en lugar de modificar directamente el atributo scoops. Ahora escribe helado.add y el número de scoops. Por último, devolver el helado al cliente. También terminaremos el método add. Este método es bastante simple. Agrega las primicias al helado, por lo que el helado.agrega las palas. Ahora rastreemos cuántas primicias vendemos. Tendremos que añadir un constructor que inicialice el número de scoops vendidos a cero. Aquí vamos a definir un nuevo constructor con el auto argumento y establecer el número de scoops vendidos igual a cero. A continuación, actualizaremos el número de primicias vendidas en el método de pedido. En el método de pedido vamos a sumar el número de primicias vendidas. Por último, en el método add, lo haremos una vez más, llenaremos el número de primicias vendidas. Pero espera, acabamos de escribir esta línea de código arriba. Si comparas estas dos líneas, 37 y 38 con las dos líneas anteriores, 32 y 33, verás que se ven idénticas. Esta es una bandera roja otra vez. Tenemos código redundante, podríamos estar rompiendo la abstracción. Resulta que lo somos. Este método agrega para las manijas del camión de helados agregando primicias a un helado, por lo que deberíamos estar usando los camiones de helados agregar método para agregar las primicias a un cono de helado. En cambio, eliminemos las líneas 32 y 33 y en su lugar sustituyamos esto por self.add sopas de helado. Ahora estamos respetando la abstracción para nuestro camión de helados. Tip, entender el contrato que proporciona una clase puede ayudarte a organizar el código dentro de la clase. Aquí, entender que el método add maneja agregar scoops y contabilizar una serie de scoops vendidos significa que podemos usar este método add en lugar de hacer ambos pasos manualmente, ahorrándonos de escribir código redundante. Ahora usemos esta clase de camión de helados. Aprendiendo de nuestros errores anteriores, sabemos ahora respetar la abstracción. De nuevo, presiona la flecha verde en la parte superior de tu archivo para ejecutar tu código. Tenga en cuenta que ahora existe un nuevo nivel de abstracción. No debemos crear ni agregar a los conos de helado directamente, en cambio, deberíamos pedir al camión de helados. Ahora vamos a crear un camión nuevo. Pide helado con tres sobres. Aquí tenemos helado uno es igual a camión.pide con tres sopas de helado, luego come algo del helado. Ahora ordenemos aún más helado de la camioneta. Vamos a teclear en camión.agregar helado uno y añadir una cucharada. Veamos cuántas primicias vendieron los camiones de helados. Se ve bien. El pedido inicial fue por tres scoops y agregamos una primicia más, haciendo un total de cuatro primicias vendidas. Para una copia de estas diapositivas y el código terminado para esta lección asegúrate de revisar la página web del curso. En esta lección, hemos cubierto alguna práctica de abstracción usando un camión de helados. En particular, has visto cómo fallé en usar la abstracción y cómo solucionarlo. Recuerda los tres consejos de esta lección, evita los números mágicos, comprueba si hay código redundante y deja claro las expectativas. La siguiente lección es la práctica de bonos. 9. (Extra) Práctica: luces sincronizadas: En esta lección, practicaremos más del concepto de abstracción que hemos discutido. Esta vez, nos basaremos en nuestra simulación de luz sincronizando algunos de los interruptores de luz. Navega a esta URL para empezar. Una vez que veas esta página, bifurca el proyecto para obtener tu propia copia editable. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable. Haga clic en los puntos suspensivos para obtener otro desplegable y finalmente, haga clic en el botón Tenedor. Entonces sugiero colocar sus ventanas Skillshare y repon.It lado a lado como se muestra aquí. Antes de empezar, quiero introducir un nuevo concepto que aún no has visto, un argumento por defecto en Python. Empecemos definiendo una función de resta. A modo de recordatorio, aquí está el formato para definir una función. Por una vez, esta diapositiva de formato es en realidad el código exacto que vamos a escribir. Escribamos nuestro código ahora. Tu código del lado derecho debe coincidir con el mío. Si te desplazas hacia abajo, verás la clase ligera que definimos en las lecciones anteriores. Justo por encima de esta clase de luz, vamos a definir el sub método que vemos en el lado izquierdo. Sigue y escribe, define sub (x, y) y devuelve x menos y. Ahora usemos esta función objetiva. Llamaremos a sub con entrada siete y cuatro. Adelante y golpea la flecha verde en la parte superior para ejecutar tu código. Después teclea sub 7, 4 para conseguir tres. Ahora, ¿qué pasa si olvidas el segundo argumento? ¿ Y si tecleamos sub siete y golpeamos “Enter”? Bueno, obtendrás un error y tu error se verá así. Te dice que te falta tu segundo argumento. Definamos otra función de resta sub dos. Esta vez vamos a asignar y un argumento por defecto de cero. Escribamos nuestro código ahora. Definimos sub2 x pero ahora escribimos y igual a cero y todo lo demás sigue igual. Este signo igual en la definición de función le da a y un valor por defecto. No siempre asigna y a cero. La función solo asigna y a cero si no das un segundo argumento de entrada. Veamos esto en acción. En primer lugar, ejecuta el archivo golpeando la flecha verde en la parte superior. Veamos qué pasa cuando pasamos ambos argumentos como antes. Tipo en sub2 7, 4 y como se esperaba, obtenemos tres. Aquí, x se asigna a siete e y se asigna a cuatro. Ahora, veamos qué pasa si sólo pasamos en un argumento. Escribe en sub2 7 y resulta que no hay error y sacamos siete. ¿ Qué pasó aquí? Esto se debe a que x se asignó a siete e y se asignó automáticamente a cero. Tenemos 7 menos 0. Ahora vamos a cubrir un concepto relacionado llamado argumentos de palabra clave. Esto se explica mejor con el ejemplo. Vamos a volver a ejecutar la versión anterior con dos números de entrada. Aquí tendremos sub2 7,4. Aquí, siete se asigna a x y la segunda entrada cuatro se asigna a y. golpeas “Enter”, obtenemos 7 menos 4 que es 3. También podemos decirle explícitamente a Python qué entrada es x y qué entrada es yAquí podemos escribir sub2, x es igual a siete y y es igual a cuatro. Podemos darle a “Enter” y aún nos quedan tres. Llamamos a estas x igual a siete, y es igual a cuatro argumentos de palabra clave. Se pueden especificar argumentos de palabra clave en cualquier orden. Aquí podemos cambiar el x y la palabra clave y argumentos sub2, y es igual a cuatro, x es igual a siete. Golpea “Enter” y aún te quedan tres. Observe que si no usa argumentos de palabra clave y cambia las entradas, entonces obtendrá algo diferente. Voy a borrar mi salida para que puedas ver la parte inferior de mi pantalla y aquí vamos a escribir en el sub2 4, 7 cambiando el orden sin usar argumentos de palabra clave y aquí la salida es diferente. Obtenemos negativo 3 porque ahora tenemos 4 menos 7 en lugar de 7 menos 4. Ahora que has cubierto argumentos predeterminados y argumentos de palabras clave, usémoslos en nuestra nueva clase. Ahora vamos a trabajar por fin en el concepto de abstracción. Vamos a sumar la capacidad de sincronizar dos luces para que alternar como Número 1 también se altere como Número 2. Adelante y desplácese a su clase de luz. Agregaremos un argumento al constructor llamado sync. Este argumento tendrá un valor predeterminado de ninguno con una mayúscula N. Ninguno solo significa vacío. Se pretende establecer la sincronización a otra luz para sincronizarla. Ya verás a qué me refiero en un segundo. Aquí vamos a definir la luz después de la sincronización de coma del auto argumento igual a ninguna. Después podemos establecer la sincronización del argumento de entrada como un atributo instanciado también llamado sync. Aquí escribiremos self.sync igual a sincronizar. Ahora usemos el atributo sync si no está vacío o en otras palabras, si el atributo sync no es ninguno, entonces cambia la sincronización a la luz. Continúa y desplázate hacia abajo hasta tu método de alternancia. Aquí vamos a escribir si self.sync sync no es ninguna, entonces conmuta la luz de sincronización. Aquí podrías sentirte tentado a simplemente alternar la luz de sincronización tú mismo escribiendo en self.sync.on es igual a no self.sync.on. No obstante, estarías rompiendo la abstracción. ¿ Y si esa luz se sincroniza con otra luz? Entonces tendríamos que comprobar si self.sync.sync no es ninguno y así sucesivamente y así sucesivamente. Vaya, eso es código redundante. Entonces como siempre, el código redundante es una gran bandera roja. En cambio, tenemos que respetar la abstracción, self.sync como una luz y podemos alternar las luces llamando a su método de toggle. En cambio escribiremos self.sync.toggle. Esto concluye nuestras luces sincronizadas. Ahora, vamos a instanciar y utilizar la luz sincronizada. Adelante y golpea la flecha verde en la parte superior para ejecutar tu código y ahora instanciemos nuestra primera luz. La luz 1 es igual a la luz. instancia de tu segunda luz pero esta vez establece el argumento de entrada de sincronización en la primera luz. Esto asegura que si activamos la luz Número 2, luz Número 1 también se alterna. Aquí definir la luz Número 2 es igual a la luz, establecer sincronización igual a la primera luz. A ver si la luz Número uno está encendida. Vamos a teclear en luz1. está encendido. Parece que nuestra primera luz no está encendida. Ahora, vamos a alternar la luz Número 2.Esto debería activar tanto la luz Número 1 como la Número 2. Aquí tenemos light2.toggle y vamos a comprobar que la luz Número 1 ya está encendida. La luz número 1 está encendida y ahora está encendida. Genial, funciona. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye nuestra práctica de abstracción adicional. 10. Concepto: herencia: Bienvenidos a otra lección conceptual, la herencia. Para entender la herencia, necesitamos entender una relación “es una”. Por ejemplo, el helado es un ejemplo de comida. Esto lo sabemos porque se puede comer comida y comer helado. No obstante, el helado también puede tener algunos métodos extra que otros alimentos pueden no, como derretir. Debido a que el helado es un ejemplo de comida, definimos el helado como una clase infantil de alimentos. También podemos decir que la subclase del helado como alimento. Nosotros llamamos a la comida la clase de padres. Definir esta “es una” relación nos da un beneficio interesante llamado herencia. Ahora, así es como funciona la herencia. Para todos los alimentos, esperamos tener el método de comer. Dado que el helado es una clase infantil de alimentos, helado hereda automáticamente el método de comer. Puedes agregar tantas clases infantiles de comida como quieras y todas ellas heredarán la misma funcionalidad de comer. Repitamos este análisis con otro ejemplo. Un camión de helados es un camión. En particular, un camión de helados tiene todas las propiedades que tiene un camión y más. En consecuencia, definimos camión de helados para ser una clase infantil de camión. Esto nos da un beneficio astuto. Esperamos que todos los camiones tengan la funcionalidad o método de accionamiento. Dado que el camión de helados es una clase infantil de camión, también hereda el método de accionamiento. Por último, el camión de helados puede tener algunos métodos adicionales que otros camiones no, como el orden. En resumen, A es un B si A tiene todas las propiedades que tiene B; por ejemplo, el helado es un alimento. Dado que el helado tiene todas las propiedades de los alimentos, esto significa que el helado hereda toda la funcionalidad de los alimentos. Por defecto, comer helado es como comer cualquier otro alimento. No obstante, ¿y si eso no es cierto? ¿ Y si comer helado es drásticamente diferente a comer otros alimentos? En otras palabras, queremos anular la funcionalidad heredada predeterminada. Este es nuestro próximo concepto en herencia, anulando. Anteriormente, dijimos que el helado heredaría el método de comer de los alimentos ya que el helado es un alimento. No obstante, digamos que el comer helado es único y a diferencia de comer comida general. Tendríamos que anular el método de comer, definiendo un método de comer personalizado para helado específicamente. Podríamos querer anular comer porque representamos la cantidad que se come de diferentes maneras. Con el helado, medimos la cantidad que queda en las primicias. Con otros alimentos, utilizamos un porcentaje. En resumen, la clase secundaria hereda método de una clase padre por defecto. No obstante, la clase secundaria puede anular o redefinir esos métodos. Estos dos conceptos son el núcleo de los “takeaways”. Cubriremos los dos últimos conceptos de bonificación después de un breve resumen de lo que hemos aprendido hasta ahora. Nuestro primer concepto, la relación “es una”, nos dice qué clases subclases entre sí. Dado que el helado es comida, helados subclases los alimentos. El helado hereda entonces métodos de los alimentos. No obstante, también podemos tener helado anular los métodos heredados de los alimentos, si es necesario. Para una copia de estas diapositivas y más recursos, asegúrate de revisar el sitio web del curso, y eso concluye nuestra lección sobre herencia. Había un montón de ideas clave en esta lección, pero los más importantes para llevar o la relación “es una” y sobresaliente. No te preocupes si los detalles son fangosos. Haremos que estas ideas sean más concretas en la siguiente lección, cuando empecemos a codificar. Ahora cubriremos dos conceptos más breves de bonus. Si te sientes abrumado o no quieres contenido extra en este momento, siéntete libre de saltar a la siguiente lección. Una interfaz, al igual que la interfaz de alimentos de la derecha, simplemente esboza expectativas pero no proporciona implementaciones por defecto. Aquí, la comida especifica un método de comer y un método de agregar, pero en realidad tampoco lo implementa. Helado implementa la interfaz de alimentos con implementaciones utilizables para ambos métodos. Nuestro último concepto es un abstracto. un resumen también se definen las expectativas para una subclase. No obstante, puede implementar algunos métodos y dejar otros sin implementar. Aquí, el resumen de alimentos implementa el método eat y especifica un método add sin implementarlo. Helado subclases el resumen de alimentos y rellena la implementación del método add, y que concluye la lección sobre herencia, incluyendo los conceptos bonus. En la siguiente lección, comenzaremos a codificar algunos de estos conceptos de herencia. 11. Práctica: camión de helados de lujo: Para practicar Herencia, haremos un Camión DelLuxeiceCreamtruck. Este DeLuxeIceCreamtruck, te da una cucharada gratis con tu pedido de helados. Navega a esta URL para empezar. Una vez que veas esta página, bifurca el proyecto para obtener tu propia copia editable. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable. Haga clic en el “Elipsis” para obtener otro desplegable. Por último, haga clic en el botón “Tenedor”. Entonces, sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. Saltarás directo a escribir una subclase. Aquí está el formato. Tenemos nuestra definición de clase normal, excepto que incluimos la clase padre en morado entre paréntesis, como vemos aquí. En este ejemplo, el hielo es la clase infantil y H_2O es la clase padre. Usemos este formato para nuestro DeLuxeiceCreamtruck ahora. Después de bifurcar el otro repl.it, deberías ver el código como el mío a la derecha. Debajo de todo el código existente, ahora vamos a definir nuestro deLuxeiceCreamtruck. En primer lugar, crea la clase DelLuxeiceCreamtruck, luego subclase camión de helados, como discutimos, escribe en clase DeLuxeiceCreamtruck, y subclasifica el camión de helados con un colon. Podemos agregar pase aquí como marcador de posición. Ahora, tendrás que anular el método de pedido ya que el DelLuxeiceCreamtruck ofrece una primicia gratuita con cada pedido. Este es el formato para definir un método. Anular un método no toma ninguna sintaxis especial. Simplemente redefina el método en la clase infantil. Aquí vamos a definir tu método de pedido. Eliminar el pase y definir el orden. Nuevamente, te necesitas a ti mismo como primer argumento y acepta un argumento, scoops. Al igual que antes, creamos un nuevo helado. Entonces llamamos al método self.add, y pasamos en número de scoops. Pero espera, esto es exactamente como antes. Esta es tu bandera roja. Como hemos estado diciendo, el código redundante significa que algo anda mal. ¿ Cómo podemos reutilizar nuestro método de pedido original arriba? Nos interesa específicamente llamar a nuestro método de clase de padres. Aquí te explicamos cómo hacer eso. Para llamar al método de la clase padre, basta con usar la super instancia. Déjame mostrarte en código ahora. Vamos a llamar a super.orden y pasar en el argumento scoops. Aquí vamos en lugar de estas dos líneas tipo en super.orden y pasamos en scoops. Aquí, esto llama al orden del método padre. Este método devuelve la instancia de helado. Por lo tanto, establezca esa instancia en una variable. Aquí tendremos helado igual a super.orden. Después añadiremos una cucharada gratis de helado sin actualizar el número de primicias vendidas. Aquí escribiremos, ice_cream.add1. En caso de que te estés preguntando, ¿por qué no usamos el método de agregar los camiones de helados? El método add que se heredó de la clase padre. obstante, no usamos el método de adición de camiones, porque el método de adición de camiones también actualiza el número de scoops vendidos. En este ejemplo específico, estamos regalando una cucharada gratis de helado y no queremos actualizar una serie de primicias vendidas. Es así como tenemos helado.add1. Por último, devolver el helado al cliente. Una nota rápida. Una buena práctica es invocar siempre al constructor de clase padre en tu propio constructor. Vamos a hacer esto ahora para otros constructores ahora. Aquí en el constructor para camión de helados, llamaremos a super.init. Después repetiremos esto una vez más para la clase de helados. Para el último segmento de esta lección, utilice la instancia de DeluxeiceCreamtruck. Vamos a dar click en el botón verde en la parte superior para ejecutar nuestro código. En primer lugar, instanciar el deLuxeiceCreamtruck. Aquí tendremos camión es igual a DeLuxeiceCreamtruck. Entonces pediremos un helado con dos sobres, helado es igual a camión.order2, y boom, el helado que recuperamos ahora tiene tres primicias. Incluye la única primicia gratis que agregamos. Podemos checar escribiendo ice_cream.scoops, y tenemos tres scoops. También podemos comprobar cuántas scoops ha vendido el camión de helados. Aquí teclearemos en camión.vendido, y solo esperamos dos. Justo como se esperaba, obtenemos dos. El camión sólo vendió dos scoops, y la tercera primicia fue gratis. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye la práctica de DelLuxeiceCreamtruck para la Herencia. La siguiente lección es una lección de práctica bonus para construir familiaridad con estas ideas. 12. (Extra) Práctica: luz parpadeante: En esta lección, volveremos a practicar la herencia. Esta vez, haremos una luz vieja que parpadea cada dos veces que la enciendas. Navega a esta URL para empezar. Una vez que veas esta página, bifurca el proyecto para obtener tu propia copia editable. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable. Haga clic en el “Puntos suspensivos” para obtener otro desplegable, y finalmente, haga clic en el “Tenedor”. Entonces sugiero colocar sus ventanas Skillshare y responde.it lado a lado como se muestra aquí. Saltaremos justo en subclase nuestra clase de luz original. Aquí está el formato para definir una subclase. En tu código, deberías ver una clase ligera que definimos en la lección anterior. Desplázate hacia abajo hasta la parte inferior de tu archivo. Aquí definiremos una luz vieja que subclasifica la clase de luz original. Vamos a teclear pase aquí por ahora. Ahora anularás el método toggle en la clase parent ya que nuestra luz necesita parpadear cada dos veces que se encienda la luz. Ahora definiremos nuestro constructor que establece parpadeo en falso. Esto significa que el valor predeterminado para todas las luces será no parpadear iniciando. Defina el constructor con el argumento auto con sincronización igual a ninguno. Recordemos que este argumento por defecto estaba en nuestro constructor de clases originales. Entonces tendremos que escribir en es igual a falso. Al igual que antes, escribiremos sync es igual a sync. Estas dos líneas parecen redundantes, y tienes razón, lo son, esto debería ser una bandera roja, ajustaremos esto en un segundo. Por último, pongamos el parpadeo en falso, esa manera la luz no parpadea por defecto. Ahora anularás el método toggle en la clase parent, ya que nuestra luz necesita parpadear cada dos veces que se encienda la luz. Aquí está el formato para definir un nuevo método. Justo debajo de nuestro constructor, ahora definiremos un método de toggle. Al igual que antes, necesitamos cambiar la luz de encendido a apagado o de apagado a encendido. Escribiremos aquí self.on es igual a no self.on. No obstante, entonces necesitamos comprobar la luz sincronizada. Si self.sync no es ninguno esto debería parecer pescado. Tenemos código redundante. Esta es una bandera roja. Este código simplemente repite el método de alternancia del padre. La solución es llamar al método padre. Tenemos que llamar al método padre. A continuación se explica cómo llamar al método padre. Simplemente usamos la super instancia como sustituto de nuestra instancia padre. De vuelta en tu código, realidad vamos a eliminar estas dos líneas y en su lugar escribir super () .toggle (). Antes de continuar, necesitaremos realmente llamar al constructor padre desde cualquier otro constructor de clases. Aquí, necesitamos llamar al constructor padre. El constructor padre en realidad toma un argumento de sincronización. A la luz original, también llamaremos a su constructor padre. Ahora, podemos terminar el método de toggle. Verificamos si la luz está encendida. Si lo es, alternar la luz parpadeando o no, esa manera cada dos veces la luz parpadea. Si la luz está encendida, entonces cambiamos si parpadea o no. Esto completa nuestra vieja luz parpadeante. Por último, usemos esta vieja luz. Adelante y haz clic en la flecha verde en la parte superior para ejecutar tu código. Entonces instanciar tu vieja luz. La luz es igual a la luz vieja (). Compruebe si parpadea o no, light.flicker. En efecto, no está parpadeando. Encendemos ahora la luz. Vamos a comprobar si la luz ahora está parpadeando. Debería ser y de hecho está parpadeando. Apague la luz luego vuelva a encenderla, y volvamos a comprobar si la luz parpadea. Esta vez, no debería serlo. En efecto, no está parpadeando. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye nuestra práctica para el concepto de herencia usando viejas luces parpadeantes. En la siguiente lección, hablaremos de un misterioso error en la programación orientada a objetos, por qué ocurre y cómo solucionarlo. 13. (Extra) Misterio: MRO: En esta lección, cubriremos misterioso error en Python. Este error se debe a un concepto llamado orden de resolución del método. Al igual que antes, nota estos misterios abordaron algunas de las partes más confusas de OOP. Si te sientes abrumado, sugiero saltarte estas sesiones misteriosas en el primer pase a este curso, revisitarlas en un segundo pase. Al igual que antes, navega para responder. it/languages/python3, ya que estaremos empezando desde cero. Entonces te sugiero colocar tus ventanas Skillshare y repl.it lado a lado como se muestra aquí. En primer lugar, permítanme explicar un concepto llamado herencia múltiple. Antes, vimos que una clase puede subclasificar a otra clase. Por ejemplo, el helado podría subclasificar la comida, porque el helado es un tipo de alimento. ¿ Y si el helado también es una bebida? ¿ Porque el helado se podría derretir? Entonces quizá queramos helados para subclasificar tanto la comida como la bebida. Veamos cómo se ve esto en código. Este es el formato. Aquí, clase C subclases tanto A como B. Para leer esto, lea de izquierda a derecha. Los métodos en C pueden anular los métodos en A. Los métodos en A pueden anular los métodos en B. Solo para hacer un seguimiento, resumiremos esto como A mayor que B, lo que significa A tiene prioridad sobre B usando esta notación anterior. Ahora presentemos el misterioso error. Aquí está el formato de nuevo. Vamos a codificarlo. Crear clase A con un cuerpo de Marcador de posición. A continuación, cree una segunda clase B, que subclase es A. Clase B subclase A y un Marcador de posición para el cuerpo. Por último, crea una tercera clase C, que subclases tanto A como B. Asegúrate de escribir tus clases exactamente en este orden. A, B, luego pase por su positor. Ahora intenta ejecutar tu código usando la flecha verde, corre en la parte superior. Aquí está el misterioso error, error de resolución del método. ¿ Qué significa esto, y cómo sucedió esto? Vamos a descomponer esto. Para entender este error, tendremos que visualizarlo. En primer lugar, B subclases A en las líneas 4 y 5. B tiene precedencia sobre A. Denotamos esto como B mayor que A. Sin embargo, C subclases tanto A como B, como escribimos aquí. De acuerdo con nuestra notación, A, B, esto significa que A tiene precedencia sobre B. Denotearemos esto como A mayor que B. Esta es la contradicción. B es mayor que A y sin embargo A es mayor que B, entonces ¿cuál, A o B tiene precedencia? De esto se está quejando Python. No sabe qué clase tiene prioridad. La siguiente pregunta natural es, ¿cómo solucionamos esto? Al volver a examinar la visualización que vimos antes, realmente podemos eliminar cualquiera de estos errores para solucionar el problema. Pero uno de estos errores es más fácil de eliminar que los demás. Podemos redefinir A y B para que B no subclase A. Esto toma un cambio de paradigma en cómo entendemos la herencia. En la siguiente lección, discutiremos exactamente qué es ese cambio de paradigma. Por ahora, para una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar la página web del curso. Esto concluye un misterio de orden de resolución de método. Hemos discutido cuándo ocurre el error, por qué ocurre, e introducido una forma de solucionar el problema. En la siguiente lección, cubriremos esto fijo con más detalle. 14. Concepto: herencia +: El objetivo de esta lección es ponerte por delante de la curva para que tu código sea mucho más flexible que otros. Existen dos conceptos que profundizarán su comprensión de programación orientada a objetos, mixins y composición. Anteriormente, platicamos mucho sobre la relación “es a” en herencia. Un paradigma común es decir, por ejemplo, que un autobús es un vehículo, es transporte. Pero, ¿qué pasa cuando tienes un autobús que ha sido convertido en un hogar? Sigue siendo un autobús, pero en realidad ya no es un vehículo. En esta lección, refinaremos nuestra comprensión de la herencia en la programación orientada a objetos. Para entender por qué necesitamos refinar, sumerjamos en el problema del circle-elipse. Esta sección requerirá que pienses mucho y depende en gran medida de tu comprensión de las lecciones anteriores. Si lo necesitas, toma agua o toma primero un descanso de estiramiento. En primer lugar, recordemos desde la escuela que un círculo es una elipse. Para jog tu memoria por qué esto es: una elipse tiene dos ejes, donde cada eje puede tener una longitud diferente. Un círculo es un caso especial donde ambos ejes tienen la misma longitud. Por lo que un círculo es un tipo especial de elipse. Decimos que un círculo es una elipse. No obstante, recordemos nuestra “es una” regla de la lección de herencia. A es una B si A tiene todas las propiedades que tiene B. Enchuparse lo que sabemos, un círculo es una elipse, ya que un círculo tiene todas las propiedades que tiene la elipse? Aguanta, eso parece realmente mal. Los círculos no tienen todas las propiedades que tiene una elipse. Un círculo sólo tiene una longitud de eje; una elipse tiene dos longitudes de ejes. Si realmente lo piensas, una elipse tiene todas las propiedades que tiene un círculo. Por lo tanto, una elipse es un círculo. Entonces, ¿nuestros maestros se equivocan? Resulta que esto tampoco está bien. Un círculo tiene un radio, pero una elipse no. Las elipses tampoco tienen todas las propiedades de un círculo. Entonces supongo que un círculo no es una elipse, y una elipse no es un círculo, al menos de acuerdo con la relación “es una” en herencia. Nuestra solución es utilizar un paradigma diferente llamado mixins. Pienso en esto como la relación “puede”. Déjame mostrarte a lo que me refiero. Aquí te damos dos clases, persona y perro. Debajo de ambas clases, he enumerado sus métodos. Empezaremos por usar la herencia. Nuestra clase de padres naturales es cosa viva, que define mover y crecer por defecto. Aquí, el texto gris bajo persona y perro significa que esas dos clases heredan esos métodos. No obstante, ¿y si agregamos una clase de auto? Un auto no es un ser vivo, pero puede moverse. Vamos a crear otra clase padre para las clases que se pueden mover. A esta nueva clase se le llama móvil, y tanto lo vivo como el automóvil heredan de ella. Genial. Pero ¿y si tuviéramos una clase de planta? Es una cosa viva, pero no se mueve. No hay una jerarquía clara donde esto funcionará. Entonces, en lugar de construir una jerarquía usando la herencia, consideremos lo que cada clase es capaz de hacer. Cada clase padre define en su lugar una propiedad del objeto. Aquí, tenemos una clase de padres para todas las clases que pueden crecer, llamada Growable, en rosa. También tenemos una clase separada, llamada Movable, en azul. Cada clase padre define un nuevo comportamiento que las subclases pueden hacer. Una planta puede crecer, una persona puede moverse y crecer, y así sucesivamente y así sucesivamente. En resumen, A can B si a tiene la capacidad B; por ejemplo, una persona es cultivable ya que una persona puede crecer. El nombre oficial para estas clases basadas en la capacidad son mixins, que mejoran en gran medida la flexibilidad de tu código. Puedes mezclar y emparejar cualquier número de habilidades diferentes para cada nueva clase que definas. Otra alternativa a la relación “es a” es la composición, donde anidamos objetos en lugar de heredar objetos. Composición se resume por “tiene a” relaciones, como cómo un auto tiene ruedas. Creo que la composición tiene más matices que la cubierta de la mayoría de los artículos en línea, pero nos detendremos aquí por ahora porque siento el matiz será más confuso que útil. Cubriremos el matiz de cómo la composición reemplaza la herencia en una clase, post o video posterior. Nuestro concepto final en esta lección es el polimorfismo. En resumen, el polimorfismo es cuando varias clases todas implementan la misma interfaz. En otras palabras, un conjunto de clases satisfacen todas las mismas expectativas. Por ejemplo, podemos implementar múltiples clases de animales, como mono y perro, que todos tienen métodos de crecimiento y movimiento. Digamos que tienes un trozo de código que solo se basa en los métodos grow and move, entonces lo genial es que podrías ejecutar ese código en cualquier clase de animal que tengas. Eso concluye nuestros conceptos para esta lección. En resumen, cubrimos el problema del circle-elipse para desvelar un defecto en las relaciones “es a”. Después cubrimos dos tipos alternativos de relaciones, “puede” y “tiene a” relaciones, para mejorar la flexibilidad de su código. Por último, discutimos brevemente un beneficio de la programación orientada a objetos, que es el polimorfismo. Para una copia de estas diapositivas y más recursos, asegúrate de consultar la página web del curso. Esto concluye nuestra lección de herencia avanzada, nivelando su comprensión de programación orientada a objetos. Esta fue una lección desafiante, así que si no lo seguiste del todo, está bien. Los consejos y tomas de esta lección tendrán más sentido a medida que comiences a usar la programación orientada a objetos y comienzas a tropezar con defectos de diseño tú mismo. En la siguiente lección, implementaremos mixins. 15. Práctica: fusión con helados: En esta lección, implementaremos helados de fusión. En particular, usaremos el concepto mixin que aprendimos a crear un helado de fusión que tanto podemos comer como beber. Acceda a la siguiente URL para comenzar. Una vez que veas esta página, bifurca el proyecto para obtener tu propia copia editable. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable. Haga clic en los puntos suspensivos para obtener otro desplegable, y finalmente, haga clic en el botón Tenedor. Entonces sugiero colocar sus ventanas Skillshare y responde.it lado a lado como se muestra aquí. Empecemos visualizando el objetivo. Ahora mismo, solo tienes clase de helado. Nuestro objetivo es agregar tanto limonada como helados de fusión. Sabemos que el helado de fusión debe subclasificar el helado. En el espíritu de los mixins, agregaremos una clase bebible, que agrega la capacidad de que una clase se emborrache. Aquí, tanto limonada como helados de fusión pueden beberse. Destacan en rojo las clases que implementaremos. Aquí hay una cosa a tener en cuenta, sin embargo. Tenga en cuenta que los helados y bebibles ambos tienen el método add. Tendremos que tener especial cuidado al usar herencia múltiple de helados derretidos. helado de fusión necesita subclasificar tanto bebible como helado, pero dar precedencia al helado. Ahora crearás estas clases una por una. En el lado derecho, verás el código que obtuvimos de las lecciones anteriores. Podemos encontrar la clase de helados desplazándose hacia abajo. También podemos encontrar la clase de camión de helados, y finalmente, la clase de camiones de helados de lujo. En la parte inferior después de esa clase, sumemos ahora nuestros mixins. Vamos a crear nuestra clase bebible. En el constructor, establece el número de copas a cero. Mediremos cuánto queda de la bebida en tazas. Aquí está nuestro constructor con auto como argumento, definiremos copas iguales a cero. A continuación, crea un método de adición que añada un cierto número de tazas a la bebida. Tienes def, el método add con este auto argumento, luego el número de copas a agregar. Entonces incrementaremos el número de copas por esta cantidad. Por último, crear un método de bebida que resta un cierto número de tazas de la bebida. Aquí tendremos el método de bebida, que toma un cierto número de tazas y deduce ese número de copas del total. Ahora volvamos a navegar de nuevo a las diapositivas. Para su referencia, aquí está el diagrama de lo que estamos construyendo. Ahora crea la clase de limonada. Nuevamente, para su referencia, aquí está nuestro diagrama. Debajo de tu código existente, vamos a crear una nueva clase de limonada. Esta clase de limonada heredará de potable. Esta clase de limonada será subclase bebible. A continuación, la clase de limonada hereda automáticamente todos los métodos de agregar y beber. Ahora para la pieza final, implementarás helado de fusión. Nuevamente para su referencia, aquí está nuestro diagrama. Crea una clase, derretiendo helado que hereda tanto de helado como de bebida. Aquí tendremos helado de fusión que hereda tanto de helado como de bebida. Observe que el ordenamiento importa. Al escribir helado primero, hacemos cumplir que el método de adición de helado tenga prioridad sobre el método de adición de bebida. Ahora vamos a añadir un método de lapse. Este método actualizará a lo largo del tiempo el número de cubos de helado sin derretir y tazas de helado derretido. Este método toma tiempo transcurrido como argumento. Aquí escribiremos transcurrir (auto), la cantidad de tiempo que ha transcurrido, y primero calcularemos el número de palas de helado que se han derretido. Se trata o bien de la cantidad de tiempo que ha transcurrido o del número de scoops que quedan; lo que sea menor. Aquí vamos a calcular derretido es igual al mínimo de ya sea un tiempo transcurrido o el número de scoops que quedan. A continuación, restar el número de primicias fundidas del número total de scoops. Aquí tendremos scoops menos iguales derretidos. Además, agrega el número de primicias derretidas a las copas de helado derretido. Aquí tendremos tazas más igual a derretido. Eso completa nuestra clase de helados derretidos. Todos los métodos add, drink, and eat se heredan de las dos clases de padres. Ahora utilizarás tu nueva clase de helado de fusión. Haga clic en la flecha verde en la parte superior para ejecutar su código, luego instancie su helado de fusión. Agrega algunas primicias, y después transcurrió el tiempo para ver cuánto se ha derretido. Aquí escribiremos ice_cream.elapse (2). Veamos cuántas primicias quedan. Esperamos que dos primicias de helado se derritan por lo que sólo se debe dejar una cucharada de helado, y de hecho vemos una. Ahora veamos cuántas tazas de helado derretido quedan. Ice_crema.Copas y esperamos dos, igual que dicen nuestros resultados. Ahora bebamos un poco de helado derretido. Ice_crema.Beba, y bebamos una taza. Ahora comprobemos cuánto helado derretido queda. Ice_crema.Copas, como era de esperar, sólo nos queda una taza. Eso es todo. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye nuestra práctica de helados derretidos. A continuación se presenta la práctica de bonus adicional para mixin. 16. (Extra) Práctica: luces temporizadas: En esta lección, practicaremos más el concepto de herencia mixin usando interruptores de luz. En particular, implementaremos luces cronometradas, que se apagan después de un cierto periodo de tiempo. Acceda a la siguiente URL para comenzar. Una vez que veas esta página, bifurca el proyecto para obtener tu propia copia comestible. Para ello, haga clic en el nombre del proyecto en la parte superior izquierda para obtener un desplegable. Haga clic en el “Elipsis” para obtener otro desplegable, y finalmente, haga clic en el botón “Tenedor”. Entonces sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. En primer lugar, visualizaremos nuestro plan. Ya tenemos una luz. Ahora vamos a crear un TimerLight, que subclasifica tanto un temporizador como una luz. Tenga en cuenta que no creamos una clase de dispositivo genérica que contenga todas estas habilidades. En cambio creamos clases separadas de temporizador y luz, donde cada una representa una habilidad como un mixin. Destacadas en rojo, son las nuevas clases que necesitaremos crear. Empecemos con una clase de temporizador. Aquí está nuestro diagrama de lo que estamos creando. Después de bifurcar tu código, tu lado derecho debería coincidir con el mío. Si me desplaza hacia abajo, verás la clase de luz que creamos en lecciones anteriores, así como la luz antigua. Al final de tu archivo, ahora vamos a crear un temporizador. Aquí tenemos temporizador de clase. En nuestro constructor, vamos a establecer el tiempo que queda a cero. Defina su constructor, y dentro del constructor, definiremos el tiempo que queda para ser cero. A continuación, defina un método set que le permita iniciar el temporizador. Definiremos set, que toma un argumento con cuánto tiempo le queda. Aquí, estableceremos un tiempo que le queda al tiempo solicitado. A continuación definimos un anillo de método para sonar cuando se acabe el tiempo. Definiremos anillo, que no toma argumentos adicionales e imprimirá, “El temporizador está listo”. Por último, definiremos un método de lapso, que transcurre el temporizador por cierta cantidad de tiempo. Aquí habremos definido transcurrido, que toma en sí mismo como su primer argumento y luego transcurrió el tiempo. En primer lugar, comprueba si queda algún tiempo en el temporizador. Si self.left es mayor que cero, entonces restar el tiempo que queda. Aquí tenemos el tiempo que queda es igual al tiempo que queda menos el tiempo transcurrido. No obstante, tenemos que asegurarnos de que esta cantidad no sea negativa. Es decir, si el tiempo transcurrido es mayor que el tiempo que queda, podría ser negativo. Escribamos aquí, max con cero, y esto asegura que el tiempo que queda siempre es no negativo. Por último, si no queda más tiempo en el temporizador, entonces deberíamos sonar. Si self.left es igual a cero, entonces deberíamos llamar a nuestro método de anillo. Ahora, deberíamos escribir nuestra clase TimerLight. De vuelta dentro de tu código, vamos a crear una clase TimerLight. Aquí tendremos TimerLight, que hereda tanto de la luz como del temporizador. Lo primero que haremos, aquí está nuestro diagrama de lo que estamos creando. Crea tu clase TimerLight, y subclase tanto la luz como el temporizador. Aquí tendremos TimerLight, con subclases tanto de luz como de temporizador. Nuestro primer paso será anular el método set. Definir conjunto, que toma en el tiempo que queda. Aquí la primera lección es respetar las barreras de abstracción. Llamaremos a las clases de padres, set método. Ahora bien, si queda algún tiempo, encienda la luz. Si self.left es mayor que cero, deberíamos encender automáticamente la luz. También debemos anular el método del anillo. Aquí definiremos anillo, que no toma argumentos adicionales, llame a su método de anillo padre, para que podamos tocar el temporizador, y luego apagar la luz, ya que el temporizador solo suena cuando se acaba el tiempo. Esto concluye nuestro TimerLight. Por último, utilizaremos nuestra clase TimerLight. Haga clic en el botón verde en la parte superior para ejecutar su código, luego cree una instancia de su temporizador. Aquí arrancaremos el reloj con cinco segundos. El temporizador está listo, cinco. Entonces vamos a transcurrir tres segundos. No debe ocurrir ningún zumbido y ninguno lo hace. Entonces necesitamos transcurrir tres segundos más. Esta vez, debería sonar. Además, el tiempo que queda debe ser cero. Comprobemos temporizador.left es de hecho cero y no negativo. A continuación, vamos a revisar nuestro TimerLight. Voy a dar click en este botón X para borrar mi salida. Ahora, crea una instancia de tu clase de temporizador. Timer_light es igual a TimerLight. Haz exactamente lo mismo. Inicia el reloj con cinco segundos, timer_light dot set con cinco. Ahora debería estar encendida la luz del tiempo. Vamos a comprobar, timer_light dot is_on, y de hecho la luz está encendida. Deberíamos entonces transcurrir tres segundos. Timer_luz de punto transcurrir (3). La luz aún debe estar encendida, así que vamos a revisar dos veces. Timer_light dot is_on, es cierto. Vamos a transcurrir otros tres segundos. Esperamos un anillo y se apague la luz. Timer_light dot transcurre, tres segundos, ese temporizador está encendido. Ese es nuestro anillo, y vamos a comprobar si la luz está encendida o no. Timer_punto de luz is_on. Ahí vamos. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Eso concluye nuestra práctica de luz de temporizador. A continuación, es otro bicho misterioso relacionado con la herencia, que puede encontrarse. Veamos qué es ese misterioso error y cómo lidiar con él. 17. (Extra) Misterio: clase base frágil: En esta lección, exploraremos fenómeno llamado Frágil Base Class. Este extraño provoca y cómo trabajar en torno a esto. Al igual que antes, navega para responder. it/languages/python3. Entonces sugiero colocar sus ventanas Skillshare y repl.it lado a lado como se muestra aquí. En primer lugar, permítanme presentar el Error. Definamos una clase A. Dentro de esta clase, definiremos un método hi, que imprime hi, e imprime hi. A continuación definirá un método hola, que también imprime hi. Entonces definirá una clase B, que subclases A. Luego anulamos el método hi to en su lugar llamar hola. Ahora esto mismo no creará problemas. Sigamos adelante y veamos cómo usar estos. Vamos a pegarle a “Run” en la parte superior. Después instanciar clase B. Llamaremos a b.hi y no hay problemas. Ahora vamos a crear el problema en la clase A. Digamos que notamos el problema de redundancia. Método hola y hola hacer exactamente lo mismo, así que decidimos tener el método hola simplemente llamar a un método hi. Actualicemos el método hola para simplemente llamar hola. Ahora intentemos esto otra vez. Vamos a golpear la flecha verde en la parte superior para ejecutar tu archivo, luego teclearemos b es igual a B para instanciar, luego llamaremos b.hi y wow. Obtuvimos este error de recursión, profundidad máxima de recursión superada. ¿ Qué pasó? Bueno, la clase B hereda el método hola, que llama hola. Clase B también anula el método hi to call hello, so hi calls hello and hello calls hi. Estos dos métodos, hola y hola, siguen llamándose infinitamente y el error en la parte inferior aquí, la profundidad máxima de recursión superada, significa que el código corrió un bajillion de veces hasta que la computadora ya no pudo manejarlo. El arreglo es simple en este caso, simplemente no redefinas hola para llamar hola. No obstante, en un sistema más complejo, esto se vuelve difícil de verificar y hacer cumplir. Desafortunadamente en Python, no hay ninguna buena solución incorporada para esto. Pero en otros idiomas, una solución es marcar los métodos como finales e imposibles de anular. En este caso, podríamos haber marcado el método hi como final. Para obtener una copia de estas diapositivas y el código terminado para esta lección, asegúrate de revisar el sitio web del curso. Esto concluye el misterio de la Frágil Clase Base y su herencia más sección. De hecho, terminamos todos los contenidos nuevos para el curso. En la siguiente lección, resumiremos tus tomas, diseños algunos pasos siguientes y describiremos el contenido extra. En la siguiente lección, resumiremos tus comidas para llevar y maquetaremos algunos pasos siguientes. Enhorabuena por llegar hasta aquí. Este no fue un curso fácil y lo has hecho bien. 18. Conclusión: Enhorabuena por construir tu primera simulación con programación orientada a objetos. Cubrimos una gran cantidad de conceptos. Conceptos como clases, instancias, a paradigmas generales como la abstracción. Eso es mucho material. Pero no te preocupes, siempre puedes volver a buscar la sintaxis si la olvidas. más importante para llevar, lo que no se puede buscar fácilmente es el paradigma de programación orientado a objetos. Cómo pensar en las entidades del mundo que te rodea como una serie de objetos que interactúan entre sí. Cómo utilizar la abstracción para la legibilidad, la herencia para la mantenibilidad, y las mezclas o composición para la flexibilidad. Si olvidas estos términos específicos, está bien. No obstante, si te encuentras escribiendo código inflexible, inmantenible o ilegible, entonces quizá valga la pena volver a visitar algunas de estas lecciones para recuperar la intuición y practicar estas ideas. Te sugiero agregar una característica totalmente nueva a tu simulación, tal vez agregar desiertos, otros desiertos, hacer camión de helados, luego enlazar y compartir tu proyecto en la pestaña de proyectos y recursos. No puedo esperar a echar un vistazo. Además, ahora que acabas de aprender OOP, probablemente tengas una forma diferente y muy única de explicar tus comidas para llevar de este curso. Si lo tienes en mente, no dudes en publicar en la discusión parte del curso de Skillshare. Si esto ha despertado tu interés y estás buscando aprender un poco más, hay unos pasos siguientes. Consulta los recursos adicionales en alvinwan.com/oop101. Dominar OOP es único y que no necesitas las respuestas correctas. En cambio, solo practica el diseño de sistemas muy complejos en OOP. Tu momento aha llegará cuando se cumplan dos condiciones. En primer lugar, te das cuenta de que tu código es difícil de leer o difícil de mantener. Segundo, vuelves a visitar este curso, aplicas esos consejos y te das cuenta de cómo hace que tu código sea fácil de escalar , fácil de extender o fácil de leer. Claro, sigue siendo un descubrimiento suave, pero en lugar de probar 100 maneras diferentes, simplemente te he pasado la respuesta correcta que los genios antes que yo se han inventado. Para aprender más codificación más allá de OOP, puedes probar la clase My Computer Vision 101 para incursionar en visión por computadora, clase MySQL 101 para iniciar bases de datos de diseño, o mi clase Data Science 101 para empezar a jugar con datos. También he diseñado este curso para ser autónomo y relativamente corto. Llega más contenido para ayudarte a codificar entrevistas y convertirte en un desarrollador avanzado de Python. Si eso suena interesante, ve a mi perfil de Skillshare y haz clic en Seguir para recibir notificaciones cuando se lance la siguiente clase. Enhorabuena una vez más por hacerlo al final del curso, y hasta la próxima vez.