{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "Y5DPSFzPmzYo" }, "source": [ "# Encapsulación de propiedades\n", "Si alguna de las propiedades iniciales del objeto declaradas en el constructor no deseamos que se puedan llegar a alterar será necesario recurrir al concepto de encapsulación.\n", "\n", "La encapsulación impide que las propiedades de un objeto se puedan modificar desde fuera de la clase. \n", "La encapsulación es optativa: en ocasiones nos interesará encapsular una propiedad del objeto definida en el constructor y en otras ocasiones no interesará encapsular otra propiedad.\n", "\n", "Se encapsula precediendo el nombre de la variable con dos guiones bajos __\n", "\n", "* self.\\__ruedas = 4\n", "\n", "Así conseguimos que, la propiedad ruedas no sea accesible (modificable) desde fuera de la clase, pero si será accesible desde dentro de la propia clase. \n", "Esto supone que si hemos encapsulado la variable ruedas, cada vez que usemos esta variable desde dentro de la clase, la usaremos con los dos guiones bajos precediendo al nombre de la variable: \n", "- self.__ruedas" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "pSfZifg2mzYr", "outputId": "6567f627-8604-4abf-d791-0516eae31f76", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "El coche está en marcha\n", "El coche tiene 4 ruedas, un ancho de 181 y un largo de 426.\n" ] } ], "source": [ "class Coche():\n", " def __init__(self):\n", " self.largo = 426\n", " self.ancho = 181\n", " self.__ruedas = 4 # encapsulamos la variable ruedas poniendo dos barras bajas __ que anteceden a la variable\n", " self.enmarcha = False\n", " def arrancar(self, arrancamos):\n", " self.enmarcha = arrancamos\n", " if self.enmarcha:\n", " return \"El coche está en marcha\"\n", " else:\n", " return \"El coche está parado\"\n", " def estado(self): # para acceder al atributo ruedas debemos ponerlo precedido por dos barras bajas\n", " print(f\"El coche tiene {self.__ruedas} ruedas, un ancho de {self.ancho} y un largo de {self.largo}.\")\n", "\n", "miCoche = Coche()\n", "print(miCoche.arrancar(True))\n", "miCoche.ruedas = 6 # aunque se pongan los dos guiones bajos sigue sin funcionar la asignación\n", "miCoche.estado()" ] }, { "cell_type": "markdown", "metadata": { "id": "gHZ5-CUEmzYt" }, "source": [ "Pese a que hemos dicho que el coche tiene 6 ruedas, no lo ha considerado y vemos que se imprime que tiene 4 ruedas. Esto se debe a que la propiedad ruedas está encapsulada y no es accesible desde fuera de la clase." ] }, { "cell_type": "markdown", "metadata": { "id": "02noKSYfmzYu" }, "source": [ "## Modificamos una propiedad encapsulada desde un método\n", "Podemos encapsular la propiedad 'enmarcha' y luego podemos modificar su valor desde fuera de la clase. ¿Cómo es posible esto?\n", "\n", "Esto es posible, ya que el valor de la propiedad 'enmarcha' si está siendo modificada desde dentro de la clase debido a que se modifica en el método 'arrancar'." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "id": "jADS5t7RmzYv", "outputId": "e72f778a-7bfb-438c-b18d-915457fa32df", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "El coche está en marcha\n", "El coche tiene 4 ruedas, un ancho de 181 y un largo de 426.\n" ] } ], "source": [ "class Coche():\n", " def __init__(self): # aquí se crea el constructor\n", " self.__largo = 426 # las propiedades llevan un self. que las antecede\n", " self.__ancho = 181\n", " self.__ruedas = 4\n", " self.__enmarcha = False\n", "\n", " def arrancar(self, arrancamos):\n", " self.__enmarcha = arrancamos # La variable enmarcha será True o False según lo que nos pasen por el parámetro arrancamos\n", " if self.__enmarcha:\n", " return \"El coche está en marcha\"\n", " else:\n", " return \"El coche está parado\"\n", "\n", " def estado(self):\n", " print(f\"El coche tiene {self.__ruedas} ruedas, un ancho de {self.__ancho} y un largo de {self.__largo}.\")\n", "\n", "miCoche = Coche()\n", "print(miCoche.arrancar(True)) # aquí modificamos la propiedad 'enmarcha' que está encapsulada gracias al método 'arrancar'\n", "miCoche.estado()" ] }, { "cell_type": "markdown", "metadata": { "id": "9HbR-ZNZmzYx" }, "source": [ "La propiedad 'enmarcha', pese a estar encapsulada, si hemos conseguido modificarla, pero esto ha sido posible a través del método 'arrancar' que actúa internamente dentro de la clase. Pero desde fuera de la clase, directamente ya no es posible acceder a la propiedad 'enmarcha'." ] } ], "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_0090.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 0 }