{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "authorship_tag": "ABX9TyN3KnCoCVSnp1Uzyt77BlbY", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "source": [ "# Ejemplo de decorador ```@property```" ], "metadata": { "id": "XK79fMVfcf1K" } }, { "cell_type": "markdown", "source": [ "* El decorador @property se utiliza para definir un método como una propiedad. * Esto significa que se puede acceder a un atributo como si fuera una propiedad.\n", "\n", "*En este ejemplo, la clase Persona tiene un atributo llamado `_nombre`. El decorador `@property` se utiliza para definir el método nombre como una propiedad. El método `getter` devuelve el valor del atributo `_nombre` y el método `setter` establece el valor del atributo `_nombre`." ], "metadata": { "id": "4YHz-hztc1b8" } }, { "cell_type": "code", "source": [ "class Persona:\n", " def __init__(self, nombre):\n", " self._nombre = nombre\n", "\n", " @property\n", " def nombre(self):\n", " return self._nombre\n", "\n", " @nombre.setter\n", " def nombre(self, valor):\n", " self._nombre = valor\n", "\n", "persona = Persona(\"Juan\")\n", "print(persona.nombre) # Juan\n", "\n", "persona.nombre = \"Pedro\"\n", "print(persona.nombre) # Pedro" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "fdh6GXQgcx7t", "outputId": "43d20275-c888-4fc4-e851-55b3777a9c16" }, "execution_count": 1, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Juan\n", "Pedro\n" ] } ] }, { "cell_type": "markdown", "source": [ "## Ejemplo Tarjeta de crédito\n", "* Usando un `setter` y un `getter`.\n", "* La clase `Tarjeta_de_credito` tiene dos atributos: `_numero` y `_vencimiento`.\n", "* El decorador `@property` se utiliza para definir los métodos numero y vencimiento como propiedades.\n", "* Los métodos `getter` devuelven los valores de los atributos correspondientes y los métodos `setter` establecen los valores de los atributos correspondientes.\n", " - El método `setter` del atributo numero comprueba si el valor es un número entero\n", " - El método `setter` del atributo vencimiento comprueba si el valor es una cadena." ], "metadata": { "id": "omfx1b5Cd5l_" } }, { "cell_type": "code", "source": [ "class Tarjeta_de_credito:\n", " def __init__(self, numero, vencimiento):\n", " self._numero = numero\n", " self._vencimiento = vencimiento\n", "\n", " @property\n", " def numero(self):\n", " return self._numero\n", "\n", " @numero.setter\n", " def numero(self, valor):\n", " if not isinstance(valor, int):\n", " raise TypeError(\"El número de la tarjeta debe ser un número entero.\")\n", " self._numero = valor\n", "\n", " @property\n", " def vencimiento(self):\n", " return self._vencimiento\n", "\n", " @vencimiento.setter\n", " def vencimiento(self, valor):\n", " if not isinstance(valor, str):\n", " raise TypeError(\"La fecha de vencimiento debe ser una cadena.\")\n", " self._vencimiento = valor\n", "\n", "tarjeta = Tarjeta_de_credito(1234567890123456, \"12/23\")\n", "print(tarjeta.numero) # 1234567890123456\n", "\n", "tarjeta.numero = 1234567890123457\n", "print(tarjeta.numero) # 1234567890123457\n", "\n", "tarjeta.numero = \"1234567890123458\" # TypeError: El número de la tarjeta debe ser un número entero.\n", "\n", "tarjeta.vencimiento = \"12/24\"\n", "print(tarjeta.vencimiento) # 12/24\n", "\n", "tarjeta.vencimiento = 1224 # TypeError: La fecha de vencimiento debe ser una cadena." ], "metadata": { "id": "p-Lt7OpjeCIk" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "En el siguiente ejemplo, se han añadido bloques try-except para manejar las excepciones que se producen cuando se intenta establecer el valor del atributo _numero con una cadena y cuando se intenta establecer el valor del atributo _vencimiento con un número entero." ], "metadata": { "id": "eFsdJwNZfJdV" } }, { "cell_type": "code", "source": [ "class Tarjeta_de_credito:\n", " def __init__(self, numero, vencimiento):\n", " self._numero = numero\n", " self._vencimiento = vencimiento\n", "\n", " @property\n", " def numero(self):\n", " return self._numero\n", "\n", " @numero.setter\n", " def numero(self, valor):\n", " if not isinstance(valor, int):\n", " raise TypeError(\"El número de la tarjeta debe ser un número entero.\")\n", " self._numero = valor\n", "\n", " @property\n", " def vencimiento(self):\n", " return self._vencimiento\n", "\n", " @vencimiento.setter\n", " def vencimiento(self, valor):\n", " if not isinstance(valor, str):\n", " raise TypeError(\"La fecha de vencimiento debe ser una cadena.\")\n", " self._vencimiento = valor\n", "\n", "tarjeta = Tarjeta_de_credito(1234567890123456, \"12/23\")\n", "print(tarjeta.numero) # 1234567890123456\n", "\n", "tarjeta.numero = 1234567890123457\n", "print(tarjeta.numero) # 1234567890123457\n", "\n", "try:\n", " tarjeta.numero = \"1234567890123458\"\n", "except TypeError as e:\n", " print(e) # El número de la tarjeta debe ser un número entero.\n", "\n", "tarjeta.vencimiento = \"12/24\"\n", "print(tarjeta.vencimiento) # 12/24\n", "\n", "try:\n", " tarjeta.vencimiento = 1224\n", "except TypeError as e:\n", " print(e) # La fecha de vencimiento debe ser una cadena." ], "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "u4w85mLDfDym", "outputId": "c77e3ca2-321c-465a-ffae-6899b3b36c7f" }, "execution_count": 2, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "1234567890123456\n", "1234567890123457\n", "El número de la tarjeta debe ser un número entero.\n", "12/24\n", "La fecha de vencimiento debe ser una cadena.\n" ] } ] } ] }