{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "4c886b82", "metadata": { "id": "4c886b82" }, "source": [ "# Herencia [8] Ejemplo de herencia múltiple" ] }, { "cell_type": "markdown", "id": "a61b70f0", "metadata": { "id": "a61b70f0" }, "source": [ "## Repaso de Herencia simple" ] }, { "cell_type": "code", "execution_count": 1, "id": "886a4a1e", "metadata": { "id": "886a4a1e", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "75e18fc8-1852-472b-bc4b-95117d6d7f49" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Madre\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Hijo(Madre):\n", " pass\n", "\n", "hijo = Hijo() # hijo hereda de la clase Madre y por eso dice Soy Madre" ] }, { "cell_type": "markdown", "id": "2d143551", "metadata": { "id": "2d143551" }, "source": [ "Podemos sobrescribir en la clase Hijo los métodos de la clase Madre, para conseguir que diga 'Soy Hijo'." ] }, { "cell_type": "code", "execution_count": 2, "id": "a8f75d36", "metadata": { "id": "a8f75d36", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a455cf42-9c42-42d4-8a39-7eac66f62fdf" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Hijo\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Hijo(Madre):\n", " def __init__(self): # sobrescribimos el método constructor\n", " print(\"Soy Hijo\")\n", "\n", "hijo = Hijo()" ] }, { "cell_type": "markdown", "id": "b43a5dfa", "metadata": { "id": "b43a5dfa" }, "source": [ "Ahora no vamos a sobrescribir completamente el método constructor de la clase Madre sino extenderla, en este caso haremos uso de la función ```super()``` que es un acceso directo a la superclase." ] }, { "cell_type": "code", "execution_count": 3, "id": "451ed889", "metadata": { "id": "451ed889", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a49fa808-2cc5-4623-9a43-3d9a2042c0aa" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Madre\n", "Soy Hijo\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Hijo(Madre):\n", " def __init__(self):\n", " super().__init__() # extendemos el método constructor de la clase Madre\n", " print(\"Soy Hijo\")\n", "\n", "hijo = Hijo()" ] }, { "cell_type": "markdown", "id": "6da9c09b", "metadata": { "id": "6da9c09b" }, "source": [ "## Herencia múltiple\n", "Vamos a crear la clase Padre y ahora la clase Hijo heredará de ambas, primero de Padre y luego de Madre. El orden importa ya que la primera que pongamos tendrá prioridad a igualdad en el nombre de los métodos o atributos utilizados." ] }, { "cell_type": "markdown", "id": "3f785923", "metadata": { "id": "3f785923" }, "source": [ "### Usando ```super()```" ] }, { "cell_type": "code", "execution_count": 4, "id": "d0b98a89", "metadata": { "id": "d0b98a89", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "58ff1418-7ada-49be-9db2-54341887492a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Padre\n", "Soy Hijo\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Padre:\n", " def __init__(self):\n", " print(\"Soy Padre\")\n", "\n", "class Hijo(Padre, Madre): # prioriza al primera que se pone\n", " def __init__(self):\n", " super().__init__() # extendemos el método constructor\n", " print(\"Soy Hijo\")\n", "\n", "hijo = Hijo()" ] }, { "cell_type": "markdown", "id": "67b73250", "metadata": { "id": "67b73250" }, "source": [ "### Usando una clase concreta: ```Madre```\n", "Si no queremos usar ```super()``` y queremos usar el constructor de Madre pondremos en lugar de ```super()``` la palabra ```Madre``` y además tendremos que pasar como argumento un ```self``` a la clase Madre ya que super lo hace implícitamente." ] }, { "cell_type": "code", "execution_count": 5, "id": "b0c68704", "metadata": { "id": "b0c68704", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "3b4d9315-f01f-47da-f133-2adf453e9d1f" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Madre\n", "Soy Hijo\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Padre:\n", " def __init__(self):\n", " print(\"Soy Padre\")\n", "\n", "class Hijo(Padre, Madre):\n", " def __init__(self):\n", " Madre.__init__(self) # extendemos el constructor de Madre\n", " print(\"Soy Hijo\")\n", "\n", "hijo = Hijo()" ] }, { "cell_type": "markdown", "id": "f40e8c2a", "metadata": { "id": "f40e8c2a" }, "source": [ "### Llamando a dos clases\n", "Podemos llamar tanto a la clase Madre como a la clase Padre usando sus métodos y constructores." ] }, { "cell_type": "code", "execution_count": 6, "id": "151178c7", "metadata": { "id": "151178c7", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "416aaa64-98e1-4fec-baee-d5320ec77fea" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Soy Madre\n", "Soy Padre\n", "Soy Hijo\n" ] } ], "source": [ "class Madre:\n", " def __init__(self):\n", " print(\"Soy Madre\")\n", "\n", "class Padre:\n", " def __init__(self):\n", " print(\"Soy Padre\")\n", "\n", "class Hijo(Padre, Madre):\n", " def __init__(self):\n", " Madre.__init__(self) # extendemos el constructor de Madre\n", " Padre.__init__(self) # extendemos el constructor de Padre\n", " print(\"Soy Hijo\")\n", "\n", "hijo = Hijo()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" }, "colab": { "name": "0310_herencia_multiple_ejemplo.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }