{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "57ffdec4", "metadata": { "id": "57ffdec4" }, "source": [ "# Herencia Ejemplo" ] }, { "cell_type": "markdown", "id": "6a2fa05f", "metadata": { "id": "6a2fa05f" }, "source": [ "## 1. Procuremos no repetir código\n", "Veamos un caso donde dos clases (Vehiculo y Moto) comparten parte del código. Lo deseable sería no repetir código.\n", "\n", "Las siguientes clases luego las organizaremos mejor gracias a la herencia." ] }, { "cell_type": "code", "execution_count": 1, "id": "8bb84e83", "metadata": { "id": "8bb84e83" }, "outputs": [], "source": [ "class Vehiculo:\n", " def __init__(self, marca, color):\n", " self.color = color\n", " self.marca = marca\n", "\n", " @property\n", " def acelerar(self):\n", " print(\"El vehículo está acelerando\")\n", "\n", "class Moto:\n", " def __init__(self, marca, color):\n", " self.color = color\n", " self.marca = marca\n", "\n", " @property\n", " def acelerar(self):\n", " print(\"El vehículo está acelerando\")" ] }, { "cell_type": "markdown", "id": "52103678", "metadata": { "id": "52103678" }, "source": [ "## 2. Usando la Herencia para no repetir atributos y métodos\n", "Vemos que el código anterior repite tanto el constructor como el método acelerar. \n", "Ahora usaremos la herencia para mejorar el código." ] }, { "cell_type": "code", "execution_count": 2, "id": "6bce3933", "metadata": { "id": "6bce3933" }, "outputs": [], "source": [ "class Vehiculo:\n", " def __init__(self, marca, color):\n", " self.color = color\n", " self.marca = marca\n", "\n", " @property\n", " def acelerar(self):\n", " print(\"El vehículo está acelerando\")\n", "\n", "class Moto(Vehiculo): # Moto hereda de Vehiculo todo, tanto los atributos como los métodos\n", " pass" ] }, { "cell_type": "markdown", "id": "beb35365", "metadata": { "id": "beb35365" }, "source": [ "Vamos a crear una instancia de Moto para ver que ha heredado todo de la clase padre Vehiculo." ] }, { "cell_type": "code", "execution_count": 3, "id": "351078be", "metadata": { "id": "351078be", "outputId": "ce99ed5a-e8a9-455b-8f06-81751d4059a8", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "El vehículo está acelerando\n" ] } ], "source": [ "m = Moto('Yamaha', 'negra') # creamos una instancia de la clase Moto\n", "m.acelerar # usamos el método heredado" ] }, { "cell_type": "markdown", "id": "120900e6", "metadata": { "id": "120900e6" }, "source": [ "## 3. Modificando un atributo de clase\n", "Supongamos ahora que tenemos un atributo de clase num_ruedas, que indica que el vehículo tiene 4 ruedas. Veamos que es posible modificar ese atributo." ] }, { "cell_type": "code", "execution_count": 4, "id": "5f304045", "metadata": { "id": "5f304045" }, "outputs": [], "source": [ "class Vehiculo:\n", " num_ruedas = 4 # atributo de clase\n", "\n", " def __init__(self, marca, color):\n", " self.color = color\n", " self.marca = marca\n", "\n", " @property\n", " def acelerar(self):\n", " print(\"El vehículo está acelerando\")\n", "\n", "class Moto(Vehiculo):\n", " pass" ] }, { "cell_type": "markdown", "id": "dcbbf239", "metadata": { "id": "dcbbf239" }, "source": [ "Ahora vamos a modificar el número de ruedas del objeto moto creado. Con ello comprobamos que es posible modificar un atributo." ] }, { "cell_type": "code", "execution_count": 5, "id": "66b3f2e4", "metadata": { "id": "66b3f2e4", "outputId": "7550ad18-ab00-4027-bf51-fd9ce652435b", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Nuestra moto tiene 2 ruedas.\n", "Nuestra moto es negra.\n" ] } ], "source": [ "m = Moto('Yamaha', 'negra')\n", "m.num_ruedas = 2\n", "print(f\"Nuestra moto tiene {m.num_ruedas} ruedas.\") # comprobamos que se ha modificado el número de ruedas\n", "print(f\"Nuestra moto es {m.color}.\") # podemos ver el atributo color desde fuera de la clase" ] }, { "cell_type": "markdown", "id": "b25f9e31", "metadata": { "id": "b25f9e31" }, "source": [ "## 4. Atributo de clase privado\n", "Hagamos que el atributo color sea privado: \\__color y veamos que obtenemos un error si intentamos acceder desde fuera de la clase." ] }, { "cell_type": "code", "execution_count": 6, "id": "7983ddc8", "metadata": { "id": "7983ddc8" }, "outputs": [], "source": [ "class Vehiculo:\n", " num_ruedas = 4\n", "\n", " def __init__(self, marca, color):\n", " self.__color = color # hacemos que color sea un atributo privado\n", " self.marca = marca\n", "\n", " @property\n", " def acelerar(self):\n", " print(\"El vehículo está acelerando\")\n", "\n", "class Moto(Vehiculo):\n", " pass" ] }, { "cell_type": "code", "execution_count": 7, "id": "0a0eb860", "metadata": { "id": "0a0eb860" }, "outputs": [], "source": [ "m = Moto('Yamaha', 'negra')\n", "#print(m.color) # provoca un error\n", "#print(m.__color) # provoca un error" ] } ], "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": "0220_herencia_ejemplo1.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }