{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "d14d6542", "metadata": { "id": "d14d6542" }, "source": [ "# Herencia [9] sobrescritura de métodos\n", "* La sobrescritura de métodos en Python se refiere a la posibilidad de que una subclase cuente con métodos con el mismo nombre que los de una clase superior pero que definen comportamientos diferentes.\n", "* Para sobrescribir un método en Python, se define un método con el mismo nombre en la subclase y se redefine su comportamiento.\n", "* El método original de la clase superior se reemplaza por el nuevo método definido en la subclase." ] }, { "cell_type": "markdown", "source": [ "* La clase Comercial hereda de la clase Empleado todos sus atributos ya que no tiene constructor propio. \n", "* La clase Comercial sobrescribe el método calcularSueldo que también existe en la clase padre." ], "metadata": { "id": "UChbRXM8ANQR" }, "id": "UChbRXM8ANQR" }, { "cell_type": "code", "execution_count": 1, "id": "181aabdf", "metadata": { "id": "181aabdf" }, "outputs": [], "source": [ "class Empleado(object): # Existe siempre una clase superior object de la que heredan todos\n", " def __init__(self, nombre, sueldoBruto):\n", " self.nombre = nombre\n", " self.bruto = sueldoBruto\n", " def calcularSueldo(self, descuentos):\n", " return self.bruto - descuentos\n", "class Comercial(Empleado):\n", " def calcularSueldo(self, descuentos, bonificaciones):\n", " return self.bruto - descuentos + bonificaciones\n", "\n", "mario = Empleado(\"Mario\", 40000)\n", "isa = Comercial(\"María Isabel\", 50000)" ] }, { "cell_type": "code", "execution_count": 2, "id": "ab69a935", "metadata": { "id": "ab69a935", "outputId": "9daef933-71d3-48b9-a752-5ff0f510e475", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "39500" ] }, "metadata": {}, "execution_count": 2 } ], "source": [ "mario.calcularSueldo(500) # un argumento" ] }, { "cell_type": "code", "execution_count": 3, "id": "4574be82", "metadata": { "id": "4574be82", "outputId": "bd5b1d28-1103-4192-a98d-dd191669a425", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "52500" ] }, "metadata": {}, "execution_count": 3 } ], "source": [ "isa.calcularSueldo(500,3000) # dos argumentos" ] }, { "cell_type": "markdown", "id": "e3dba2a9", "metadata": { "id": "e3dba2a9" }, "source": [ "## Parámetros por defecto\n", "Podemos poner un valor por defecto en un parámetro de forma que si no se pasa ese parámetro como argumento se toma el valor por defecto." ] }, { "cell_type": "code", "execution_count": 4, "id": "afcaafd7", "metadata": { "id": "afcaafd7" }, "outputs": [], "source": [ "class Empleado():\n", " def __init__(self, nombre, sueldoBruto):\n", " self.nombre = nombre\n", " self.bruto = sueldoBruto\n", " def calcularSueldo(self, descuentos):\n", " return self.bruto - descuentos\n", "class Comercial(Empleado):\n", " def calcularSueldo(self, descuentos, bonificaciones=0): # parámetro por defecto\n", " return self.bruto - descuentos + bonificaciones\n", "\n", "mario = Empleado(\"Mario Pablo\", 40000)\n", "isa = Comercial(\"María Isabel\", 50000)" ] }, { "cell_type": "code", "execution_count": 5, "id": "1899ca1c", "metadata": { "id": "1899ca1c", "outputId": "790ee09e-7e5f-46ad-a89d-d9aea8426822", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "39500" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "mario.calcularSueldo(500) # un argumento" ] }, { "cell_type": "code", "execution_count": 6, "id": "eee93a63", "metadata": { "id": "eee93a63", "outputId": "d1b97a8e-baff-462b-c927-02eb05026bb7", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "49500" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "isa.calcularSueldo(500) # un argumento, pero usa su propio método" ] }, { "cell_type": "markdown", "source": [ "## Ejemplo con Animal y Perro\n", "* En este ejemplo, la clase `Perro` hereda de la clase `Animal`.\n", "* La subclase `Perro` sobrescribe el método `hacer_sonido()` de la clase `Animal` para que el perro ladre en lugar de hacer un sonido genérico." ], "metadata": { "id": "haEobzJLArLO" }, "id": "haEobzJLArLO" }, { "cell_type": "code", "source": [ "class Animal:\n", " def __init__(self, nombre):\n", " self.nombre = nombre\n", "\n", " def hacer_sonido(self):\n", " print(\"El animal hace un sonido\")\n", "\n", "class Perro(Animal):\n", " def hacer_sonido(self): # estamos sobrescribiendo el método hacer_sonido\n", " print(\"El perro ladra\")\n", "\n", "mi_perro = Perro(\"Buddy\")\n", "mi_perro.hacer_sonido() # Output: El perro ladra" ], "metadata": { "id": "i4AsmhQ2AxUK", "outputId": "701bea87-a6be-4700-ec29-c9bf69d71bd2", "colab": { "base_uri": "https://localhost:8080/" } }, "id": "i4AsmhQ2AxUK", "execution_count": 7, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "El perro ladra\n" ] } ] }, { "cell_type": "markdown", "source": [ "## La función `super()`\n", "* La función `super()` se utiliza para llamar al método de la clase superior `Animal` desde la subclase `Perro`.\n", "* La clase `Perro` hereda de la clase `Animal`.\n", "* La subclase `Perro` sobrescribe el método `hacer_sonido()` de la clase `Animal` para que el perro ladre en lugar de hacer un sonido genérico.\n", "* Sin embargo, también se utiliza la función `super()` para llamar al método original de la clase superior `Animal`.\n", " 1. El método original, al ser llamado, imprime “El animal hace un sonido”.\n", " 2. El método específico imprime \"Mi perro Buddy ladra\"." ], "metadata": { "id": "M22iH727E3f3" }, "id": "M22iH727E3f3" }, { "cell_type": "code", "source": [ "class Animal:\n", " def __init__(self, nombre):\n", " self.nombre = nombre\n", "\n", " def hacer_sonido(self):\n", " print(\"El animal hace un sonido\")\n", "\n", "class Dog(Animal):\n", " def hacer_sonido(self): # estamos sobrescribiendo el método hacer_sonido\n", " super().hacer_sonido() # llamamos al método de la clase superior\n", " print(f\"Mi perro {self.nombre} ladra\")\n", "\n", "mi_perro = Dog(\"Buddy\")\n", "mi_perro.hacer_sonido() # Aquí la salida es doble" ], "metadata": { "id": "vNhXOvWUE2su", "outputId": "8ae3b28f-1a3e-456d-fd49-08c96e750084", "colab": { "base_uri": "https://localhost:8080/" } }, "id": "vNhXOvWUE2su", "execution_count": 8, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "El animal hace un sonido\n", "Mi perro Buddy ladra\n" ] } ] } ], "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": "0320_sobrescritura_de_metodos.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }