{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "7ec53927", "metadata": { "id": "7ec53927" }, "source": [ "# Getter y Setter en Python\n", "En Python, en principio, el acceso a todos los atributos y métodos es público. En otros leguajes como JAVA se ha de indicar si el atributo o método es público (Public) o privado (Privae). \n", "Si deseamos utilizar atributos o métodos privados en Python lo que hacemos es usar el prefijo de doble barra baja: \n", "* \\__atributo\n", "* \\__método\n", "\n", "Pero esta forma de trabajar se la puede saltar por parte de un programador experimentado." ] }, { "cell_type": "markdown", "id": "c8551adf", "metadata": { "id": "c8551adf" }, "source": [ "## Al estilo JAVA" ] }, { "cell_type": "code", "execution_count": 1, "id": "d752d756", "metadata": { "id": "d752d756" }, "outputs": [], "source": [ "class Piloto:\n", " def __init__(self):\n", " self.edad = 0\n", "\n", " def get_edad(self): # método getter\n", " print(\"Se ha llamado al método getter\")\n", " return self.edad\n", "\n", " def set_edad(self, e): # método setter\n", " if e < 18: # e es una variable auxiliar que representa la edad\n", " print(\"Los menores de edad no pueden pilotar.\")\n", " print(\"Se ha llamado al método setter\")\n", " self.edad = e\n", "\n", "leo = Piloto()" ] }, { "cell_type": "code", "execution_count": 2, "id": "8ce59b12", "metadata": { "id": "8ce59b12", "outputId": "5f3fa0c4-d8db-407f-cc2c-6463577f401f", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "0" ] }, "metadata": {}, "execution_count": 2 } ], "source": [ "leo.edad # acceso directo a la edad, similar a get_edad()\n", " # pero a get_edad() podemos añadirle algo de lógica" ] }, { "cell_type": "code", "execution_count": 3, "id": "d9e18def", "metadata": { "id": "d9e18def", "outputId": "bd3a35d7-89ef-48ae-a454-46db6e9e546d", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se ha llamado al método setter\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "29" ] }, "metadata": {}, "execution_count": 3 } ], "source": [ "leo.set_edad(29) # similar a leo.edad=29 pero al set le podemos añadir lógica\n", "leo.edad" ] }, { "cell_type": "code", "execution_count": 4, "id": "a58864fb", "metadata": { "id": "a58864fb", "outputId": "3adfd10c-32bf-4cba-9441-a50ba543a214", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se ha llamado al método getter\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "29" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "leo.get_edad()" ] }, { "cell_type": "markdown", "id": "1e462551", "metadata": { "id": "1e462551" }, "source": [ "Probar con una edad de 9 años y veremos la frase 'Los menores de edad no pueden pilotar'" ] }, { "cell_type": "markdown", "id": "2d568301", "metadata": { "id": "2d568301" }, "source": [ "## Con decoradores\n", "Usando decoradores conseguimos ocultar completamente los atributos y métodos para que no sean accesibles desde fuera de la clase.\n", "\n", "El método getter se consigue con el decorador @property. Debajo de él la función se tiene que llamar necesariamente edad.\n", "\n", "El método setter se consigue con el decorador de nombre obligatorio @edad.setter y la función debe llamarse necesariamente edad." ] }, { "cell_type": "code", "execution_count": 5, "id": "bdb08b4a", "metadata": { "id": "bdb08b4a", "outputId": "20ceb372-9525-40c0-d5e9-8af38b0d285c", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Se ha llamado al método setter\n", "Se ha llamado al método getter\n", "29\n" ] } ], "source": [ "class Piloto:\n", " def __init__(self):\n", " self._edad = 0\n", "\n", " @property # usando un decorador como método getter\n", " def edad(self):\n", " print(\"Se ha llamado al método getter\")\n", " return self._edad\n", "\n", " @edad.setter # método setter\n", " def edad(self, e): # e es una variable auxiliar que representa la edad\n", " if e < 18:\n", " raise ValueError(\"Los menores de edad no pueden pilotar\") # forzamos este error\n", " print(\"Se ha llamado al método setter\")\n", " self._edad = e\n", "\n", "leo = Piloto()\n", "\n", "leo.edad = 29 # si ponemos una edad de un menor salta un error que nosotros hemos forzado con raise\n", "\n", "print(leo.edad)" ] } ], "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_0130.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }