{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "caae6d94", "metadata": { "id": "caae6d94" }, "source": [ "# Modificando atributos\n", "* Podemos modificar atributos de un objeto de dos formas:\n", " 1. modificándolos directamente desde la instancia\n", " 2. escribiendo métodos que actualicen los atributos de formas concretas\n", "\n", "Primero vamos a crear una clase sobre la que trabajar." ] }, { "cell_type": "code", "execution_count": 1, "id": "59e4e98b", "metadata": { "id": "59e4e98b", "outputId": "f2c29d75-2702-4ff3-d630-13e10d7f21f8", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se llama Thor, tiene 7 años y es de raza Mastín.\n" ] } ], "source": [ "class Perro:\n", " '''Clase que representa un perro'''\n", " def __init__(self, nombre, raza, edad):\n", " self.nombre = nombre\n", " self.raza = raza\n", " self.edad = edad\n", " def get_descripcion(self):\n", " print(f\"Se llama {self.nombre}, tiene {self.edad} años y es de raza {self.raza}.\")\n", "\n", "miPerro = Perro(\"Thor\", \"Mastín\", 7)\n", "miPerro.get_descripcion() # si el método get usa un return tendríamos que poner un print aquí" ] }, { "cell_type": "markdown", "id": "2b945a0a", "metadata": { "id": "2b945a0a" }, "source": [ "## Modificando atributos directamente desde la instancia" ] }, { "cell_type": "code", "execution_count": 2, "id": "1546a6ce", "metadata": { "id": "1546a6ce", "outputId": "f6a3d719-4ff6-4f61-b000-9d12a8178a34", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se llama Thor, tiene 7 años y es de raza Mastín.\n", "Thor cuenta actualmente con 0 vacunas.\n", "Thor cuenta actualmente con 4 vacunas.\n" ] } ], "source": [ "class Perro:\n", " '''Clase que representa un perro'''\n", " def __init__(self, nombre, raza, edad): # no se incluyen las variables que se crean con un valor por defecto\n", " self.nombre = nombre\n", " self.raza = raza\n", " self.edad = edad\n", " self.vacunas = 0 # añadimos una variable con las vacunas por defecto\n", " def get_descripcion(self):\n", " print(f\"Se llama {self.nombre}, tiene {self.edad} años y es de raza {self.raza}.\")\n", " def read_vacunas(self): # método que informa del nombre del perro y el número de vacunas que tiene\n", " '''Imprime la cantidad de vacunas que tiene puestas el perro'''\n", " print(f\"{self.nombre} cuenta actualmente con {self.vacunas} vacunas.\")\n", "\n", "miPerro = Perro(\"Thor\", \"Mastín\", 7)\n", "miPerro.get_descripcion()\n", "\n", "# Modificando valores de los atributos directamente\n", "miPerro.read_vacunas() # nos informa del número de vacunas antes de vacunarle\n", "miPerro.vacunas=4 # ahora miPerro tendrá asignadas 4 vacunas\n", "miPerro.read_vacunas() # nos informa del número de vacunas después de vacunarle" ] }, { "cell_type": "markdown", "id": "5fdb304c", "metadata": { "id": "5fdb304c" }, "source": [ "## Escribiendo métodos que actualicen los atributos" ] }, { "cell_type": "markdown", "id": "eb9fb6b8", "metadata": { "id": "eb9fb6b8" }, "source": [ "* Lo habitual no será que el usuario acceda a las variables directamente y que modifique los atributos como en la línea \n", "`miPerro.vacunas = 4` \n", "* Lo aconsejable es crear un método set_vacunas mediante el cual podamos acceder y modificar el atributo vacunas." ] }, { "cell_type": "code", "execution_count": 3, "id": "377d956c", "metadata": { "id": "377d956c", "outputId": "e747d502-e195-4381-c80f-b755dfee9596", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se llama Thor, tiene 7 años y es de raza Mastín.\n", "Thor cuenta actualmente con 6 vacunas.\n" ] } ], "source": [ "class Perro:\n", " '''Clase que representa un perro'''\n", " def __init__(self, nombre, raza, edad): # no se incluyen las variables que se crean con un valor por defecto\n", " self.nombre = nombre\n", " self.raza = raza\n", " self.edad = edad\n", " self.vacunas = 0 # añadimos una variable con las vacunas por defecto\n", " def get_descripcion(self):\n", " print(f\"Se llama {self.nombre}, tiene {self.edad} años y es de raza {self.raza}.\")\n", " def read_vacunas(self): # método que informa del nombre del perro y el número de vacunas que tiene\n", " '''Imprime la cantidad de vacunas que tiene puestas el perro'''\n", " print(f\"{self.nombre} cuenta actualmente con {self.vacunas} vacunas.\")\n", " def set_vacunas(self, num_vacunas): # método que actualiza el número de vacunas\n", " '''Actualiza el número de vacunas'''\n", " self.vacunas = num_vacunas # actualiza la variable self.vacunas\n", "\n", "miPerro=Perro(\"Thor\",\"Mastín\",7)\n", "miPerro.get_descripcion()\n", "\n", "# Modificando valores de atributos mediante métodos\n", "miPerro.set_vacunas(6)\n", "miPerro.read_vacunas()" ] }, { "cell_type": "markdown", "id": "420bd8a7", "metadata": { "id": "420bd8a7" }, "source": [ "### Añadiendo lógica a los métodos que modifican los atributos" ] }, { "cell_type": "markdown", "id": "bee3d041", "metadata": { "id": "bee3d041" }, "source": [ "Podríamos pensar que no ganamos nada usando métodos para modificar los atributos cuando los podemos modificar de forma directa. \n", "Veamos un ejemplo añadiendo un poco de lógica al método set_vacunas para que ahora no sea posible reducir el número de vacunas." ] }, { "cell_type": "code", "execution_count": 4, "id": "b9d4d655", "metadata": { "id": "b9d4d655", "outputId": "a4344157-df4e-44e5-d56b-9452ddbe6133", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se llama Thor, tiene 7 años y es de raza Mastín.\n", "Thor cuenta actualmente con 5 vacunas.\n", "No es posible reducir el número de vacunas que ya tiene administradas.\n", "Thor cuenta actualmente con 5 vacunas.\n" ] } ], "source": [ "class Perro:\n", " '''Clase que representa un perro'''\n", " def __init__(self, nombre, raza, edad):\n", " self.nombre = nombre\n", " self.raza = raza\n", " self.edad = edad\n", " self.vacunas = 0\n", " def get_descripcion(self):\n", " print(f\"Se llama {self.nombre}, tiene {self.edad} años y es de raza {self.raza}.\")\n", " def read_vacunas(self):\n", " '''Imprime la cantidad de vacunas que tiene puestas el perro'''\n", " print(f\"{self.nombre} cuenta actualmente con {self.vacunas} vacunas.\")\n", " def set_vacunas(self, num_vacunas): # añadimos un poco de lógica al método para evitar reducir vacunas\n", " '''Actualiza el número de vacunas e impide\n", " que puedan reducirse las vacunas ya puestas'''\n", " if num_vacunas >= self.vacunas:\n", " self.vacunas = num_vacunas # si deja actualiza la variable self.vacunas\n", " else: # no deja actualizar las vacunas e imprime un mensaje\n", " print(\"No es posible reducir el número de vacunas que ya tiene administradas.\")\n", "\n", "\n", "miPerro=Perro(\"Thor\", \"Mastín\", 7)\n", "miPerro.get_descripcion()\n", "miPerro.set_vacunas(5)\n", "miPerro.read_vacunas()\n", "miPerro.set_vacunas(4)\n", "miPerro.read_vacunas()" ] }, { "cell_type": "markdown", "id": "3f5d9d4a", "metadata": { "id": "3f5d9d4a" }, "source": [ "## Enviando un email\n", "Crearemos un método que modifique el atributo que nos indica si el email ha sido enviado." ] }, { "cell_type": "code", "execution_count": 5, "id": "1d09007a", "metadata": { "id": "1d09007a", "outputId": "08f3d980-9d12-49fa-d40f-e4e435ba98b9", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "False" ] }, "metadata": {}, "execution_count": 5 } ], "source": [ "class Email:\n", " def __init__(self): # método constructor\n", " self.enviado = False # atributo de instancia (inicialmente False)\n", " def enviar_correo(self): # método que establece el atributo como True (parecido a un setter)\n", " self.enviado = True # el atribulo lo establece en True, pero nunca en False\n", "\n", "mi_correo = Email()\n", "mi_correo.enviado # consultamos el valor del atributo. Mi correo inicialmente no se ha enviado" ] }, { "cell_type": "code", "execution_count": 6, "id": "6ff2367d", "metadata": { "id": "6ff2367d", "outputId": "bd27b720-44bc-4153-f6fa-30827f8b23fe", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "True" ] }, "metadata": {}, "execution_count": 6 } ], "source": [ "mi_correo.enviar_correo() # ejecutamos el método de enviar corro que modifica el atributo\n", "mi_correo.enviado # mi correo ha sido enviado" ] } ], "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": "calisto2_0070.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }