{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "e63C6ajS04Qf" }, "source": [ "# Herencia [3] ```super()``` ```isinstance()```\n", "Veamos las funciones:\n", "- super()\n", "- isinstance()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "iqdzzHrL04Qk", "outputId": "450e8827-e4f6-490b-98d1-3b2184ae5afb", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Me llamo Juan, tengo 24 años y vivo en Ávila.\n" ] } ], "source": [ "class Persona():\n", " def __init__(self, nombre, edad, lugar):\n", " self.nombre = nombre\n", " self.edad = edad\n", " self.lugar = lugar\n", " def descripcion(self):\n", " print(f\"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.\")\n", "\n", "juan = Persona(\"Juan\", 24, \"Ávila\")\n", "juan.descripcion()" ] }, { "cell_type": "markdown", "metadata": { "id": "94WVrldz04Qo" }, "source": [ "### ```super()```" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "Oq7ZjN8T04Qp", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f0829e26-c65b-4007-8467-50e3ed9d225a" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Me llamo Jose, tengo 27 años y vivo en Málaga.\n" ] } ], "source": [ "class Empleado(Persona): # la clase Empleado hereda de la clase Persona\n", " def __init__(self, empresa, salario):\n", " super().__init__(\"Jose\", 27, \"Málaga\") # super hace referencia, en este caso, a la clase Persona\n", " self.enpresa = empresa\n", " self.salario = salario\n", "\n", "ana=Persona(\"Ana María\", 35, \"Plasencia\")\n", "jose=Empleado(\"IBM\", 35000)\n", "jose.descripcion() # en la descripción aún no aparece información de emp. y salario" ] }, { "cell_type": "markdown", "metadata": { "id": "Uq6NFbRd04Qs" }, "source": [ "Hemos pasado valores fijos al constructor y esto no puede ser ya que \n", "ahora todos los empleados se llamarán Jose, tendrán 27 años y serán de Málaga. \n", "Para solucionar este inconveniente añadimos la instrucción \\_\\_init\\_\\_ dentro del constructor y añadimos unas variables. \n", "- La instrucción super() va dentro del constructor\n", "- La instrucción super() llama al método init de la clase padre" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "XIrD06ci04Qy", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f79dccaa-64bc-418c-b132-a5f5ce2c14ab" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Me llamo Francisco, tengo 25 años y vivo en Elche.\n", "Me llamo Isabel, tengo 55 años y vivo en Madrid.\n" ] } ], "source": [ "class Persona():\n", " def __init__(self, nombre, edad, lugar):\n", " self.nombre = nombre\n", " self.edad = edad\n", " self.lugar = lugar\n", " def descripcion(self):\n", " print(f\"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.\")\n", "\n", "class Empleado(Persona):\n", " def __init__(self, empresa, salario, nombre_empleado, edad_empleado, lugar_empleado): # añadimos variables\n", " super().__init__(nombre_empleado, edad_empleado, lugar_empleado) # usamos las variables\n", " self.enpresa = empresa\n", " self.salario = salario\n", "\n", "paco=Empleado(\"AXA\",28500,\"Francisco\",25,\"Elche\") # ahora pasamos 5 parámetros\n", "paco.descripcion()\n", "\n", "isa=Empleado(\"IBM\",45300,\"Isabel\",55,\"Madrid\") # ahora ya no son valores fijos y puedo tener varios objetos\n", "isa.descripcion()" ] }, { "cell_type": "markdown", "metadata": { "id": "sI7m5ed_04Q2" }, "source": [ "Ahora ya hemos conseguido crear varias instancias y que no todos se llamen igual. Esto ha sido posible gracias a la introducción de nuevas variables y a la instrucción super().\n", "\n", "Aún tenemos otro problema que consiste en que al pedir a los empleados que nos den su descripción, nos informan de su nombre, edad y lugar de residencia, pero no nos dicen nada sobre su empresa y su salario.\n", "\n", "La solución pasa nuevamente por la instrucción super(). Hemos de añadir el método descripción dentro de la clase empleado." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "id": "045xlk8s04Q3", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "99c56658-e841-424a-ae1d-2fb5903e41ba" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Me llamo Isabel, tengo 55 años y vivo en Madrid.\n", "Trabajo en IBM y mi salario bruto es 45300 €.\n", "==================================================\n", "Me llamo Francisco, tengo 25 años y vivo en Elche.\n", "Trabajo en AXA y mi salario bruto es 28500 €.\n" ] } ], "source": [ "class Persona():\n", " def __init__(self, nombre, edad, lugar):\n", " self.nombre = nombre\n", " self.edad = edad\n", " self.lugar = lugar\n", " def descripcion(self):\n", " print(f\"Me llamo {self.nombre}, tengo {self.edad} años y vivo en {self.lugar}.\")\n", "\n", "class Empleado(Persona):\n", " def __init__(self, empresa, salario, nombre_empleado, edad_empleado, lugar_empleado): # añadimos variables\n", " super().__init__(nombre_empleado, edad_empleado, lugar_empleado) # usamos las variables\n", " self.empresa = empresa\n", " self.salario = salario\n", " def descripcion(self):\n", " super().descripcion()\n", " print(f\"Trabajo en {self.empresa} y mi salario bruto es {self.salario} €.\")\n", "\n", "paco=Empleado(\"AXA\", 28500, \"Francisco\", 25, \"Elche\") # ahora pasamos 5 parámetros\n", "isa=Empleado(\"IBM\", 45300, \"Isabel\", 55, \"Madrid\") # ahora ya no son valores fijos, puedo tener varias instancias\n", "\n", "isa.descripcion() # imprime dos líneas, una es la descripción de Persona y\n", "print(\"=\"*50) # la otra es la descripción de Empleado\n", "paco.descripcion()" ] }, { "cell_type": "markdown", "metadata": { "id": "VRAcvfGv04Q6" }, "source": [ "### Otro ejemplo" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "lhRBXRHr04Q7", "outputId": "34ffcaa9-f00e-44d3-c218-7ef36d54a5c0", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Pertenece a un grupo constuctor\n", "Tecpresa es una empresa del grupo Ferrovial\n" ] } ], "source": [ "class Matriz:\n", " def __init__(self, nombre):\n", " print(nombre, 'es una empresa del grupo Ferrovial')\n", "\n", "class Filial(Matriz):\n", " def __init__(self):\n", " print('Pertenece a un grupo constuctor')\n", " super().__init__('Tecpresa') # el método init de la superclase requiere nombre\n", " #Matriz.__init__(self.'Tecpresa') # equivale a la línea anterior\n", "\n", "tec = Filial()" ] }, { "cell_type": "markdown", "metadata": { "id": "Z2HzYzXV04Q_" }, "source": [ "## Principio de sustitución\n", "Un objeto (intancia) de la subclase siempre será un objeto de la superclase. \n", "Un empleado **siempre es** una persona. " ] }, { "cell_type": "markdown", "metadata": { "id": "t7jXh8Pn04RE" }, "source": [ "### ```isinstance()```\n", "La instrucción ```isinstance()``` nos informará si un objeto concreto es una instancia que pertenece a cierta clase. Esto nos vendrá bien cuando el código se complique y ya no recordemos si un objeto pertenece a una clase.\n", "\n", "La instancia paco es un objeo de tipo Empleado y vamos a preguntar si es también de tipo Persona. Vamos a confirmarlo." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "id": "lbJYlUyt04RG", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "e3b8c6da-c9a9-4ac1-da99-0a97a15454c4" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "isinstance(paco, Empleado) # vamos a preguntar si paco es una instancia de tipo Empleado" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "id": "1pVPNeaE04RH", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "a0963bd7-e9ba-4534-a1d9-18d117d15e6d" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 7 } ], "source": [ "isinstance(paco, Persona) # vamos a preguntar si paco es una instancia de tipo Persona" ] }, { "cell_type": "markdown", "metadata": { "id": "ezNlUIEJ04RI" }, "source": [ "#### Creamos una Persona que no es Empleado" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "id": "24pwHrc004RK", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "f3847ead-9879-4fea-b7d4-d28373e43a7c" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 8 } ], "source": [ "luis=Persona(\"Luis\", 32, \"Cuenca\") # creamos un nuevo objeto de tipo Persona, solo con tres argumentos\n", "isinstance(luis, Persona) # luis es una Persona" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "id": "LGEjX1bW04RK", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "ab991d70-af2f-4ec2-bae6-fffb2cfc9f32" }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "False" ] }, "metadata": {}, "execution_count": 9 } ], "source": [ "isinstance(luis, Empleado) # vemos que luis no es Empleado ya que una Persona no siempre es Empleado" ] }, { "cell_type": "markdown", "metadata": { "id": "fDYeuqzj04RM" }, "source": [ "## Consiguiendo que una bici eléctrica tenga marca y modelo\n", "En el caso anterior miBici era una instancia de la clase BicicletaElectrica." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "id": "LLgOB9Qk04RV", "colab": { "base_uri": "https://localhost:8080/" }, "outputId": "17b7c574-6a66-4b4b-dc3c-5d1224c291f6" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Marca: Xiaomi \n", "Modelo: Qicycle \n", "En marcha: True \n", "Acelerando: False \n", "Frenando: False\n" ] } ], "source": [ "class Vehiculo():\n", " def __init__(self, marca, modelo):\n", " self.marca = marca\n", " self.modelo = modelo\n", " self.enmarcha = False\n", " self.acelera = False\n", " self.frena = False\n", " def arrancar(self):\n", " self.enmarcha = True\n", " def acelerar(self):\n", " self.acelera = True\n", " def frenar(self):\n", " self.frena = True\n", " def estado(self):\n", " print(f\"Marca: {self.marca} \\nModelo: {self.modelo} \\\n", " \\nEn marcha: {self.enmarcha} \\nAcelerando: {self.acelera} \\nFrenando: {self.frena}\")\n", "class VElectrico(Vehiculo): # ahora esta clase hereda de Vehiculo\n", " def __init__(self,marca,modelo): # ahora añadimos marca y modelo\n", " super().__init__(marca,modelo) # super() va antes que autonomía\n", " self.autonomia = 300\n", " def cargarEnergia(self):\n", " self.cargando = True\n", "\n", "class BicicletaElectrica(VElectrico): # hereda de la clase VElectrico que a su vez hereda de Vehiculo\n", " pass\n", "\n", "suBici=BicicletaElectrica(\"Xiaomi\", \"Qicycle\") # ahora si podemos dar marca y modelo a la nueva instancia\n", "\n", "suBici.arrancar()\n", "suBici.estado()" ] } ], "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": "0250_herencia_super_isinstance.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 0 }