{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "id": "d6e36c78", "metadata": { "id": "d6e36c78" }, "source": [ "# Ocultación de atributos y métodos\n", "Estamos dentro de la Encapsulación o Encapsulamientos, vamos a tratar el tema de la ocultación o el ocultamiento de datos.\n", "\n", "Ocultando datos desde fuera de la clase pretendemos defender la integridad del objeto." ] }, { "cell_type": "markdown", "id": "65bc640b", "metadata": { "id": "65bc640b" }, "source": [ "## Caso 1\n", "En este caso la variable pin es accesible desde fuera de la clase." ] }, { "cell_type": "code", "execution_count": 1, "id": "db6bb5bd", "metadata": { "id": "db6bb5bd", "outputId": "c518eb28-8524-4ee5-d897-79f429336e52", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1234" ] }, "metadata": {}, "execution_count": 1 } ], "source": [ "class Cliente:\n", " def __init__(self):\n", " self.pin = 1234\n", "\n", "persona = Cliente()\n", "persona.pin" ] }, { "cell_type": "markdown", "id": "00bb2387", "metadata": { "id": "00bb2387" }, "source": [ "## Caso 2\n", "En este caso la variable **\\_\\_pin** no es accesible desde fuera de la clase." ] }, { "cell_type": "code", "execution_count": 2, "id": "acfd6b60", "metadata": { "id": "acfd6b60" }, "outputs": [], "source": [ "class Cliente:\n", " def __init__(self):\n", " self.__pin = 1234\n", "\n", "persona = Cliente()\n", "#persona.__pin # AttributeError: 'Cliente' object has no attribute '__pin'" ] }, { "cell_type": "markdown", "id": "13e4ce56", "metadata": { "id": "13e4ce56" }, "source": [ "## Caso 3\n", "Podemos crear un método tipo get que desde dentro de la clase acceda a la variable oculta." ] }, { "cell_type": "code", "execution_count": 3, "id": "71bf313b", "metadata": { "id": "71bf313b", "outputId": "877f7c90-ea5e-407b-d4ff-7652772d0c42", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1234" ] }, "metadata": {}, "execution_count": 3 } ], "source": [ "class Cliente:\n", " def __init__(self):\n", " self.__pin = 1234\n", " def getPin(self):\n", " return self.__pin\n", "\n", "persona = Cliente()\n", "persona.getPin()" ] }, { "cell_type": "markdown", "id": "27d72a9c", "metadata": { "id": "27d72a9c" }, "source": [ "## Caso 4\n", "El intérprete de Python lo que hace es cambiar el nombre a las variables que llevan un prefijo de doble barra baja. El nuevo nombre es:\n", " \n", "* objeto._nombreClase__nombreAtributo\n", "* persona._Cliente__pin\n", " \n", "Conociendo esta nueva variable si tendremos acceso a su valor desde fuera de la clase." ] }, { "cell_type": "code", "execution_count": 4, "id": "63b283dd", "metadata": { "id": "63b283dd", "outputId": "bcdee8e7-4bd9-4bc2-f7c4-eb11e70e23e0", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "1234" ] }, "metadata": {}, "execution_count": 4 } ], "source": [ "class Cliente:\n", " def __init__(self):\n", " self.__pin = 1234\n", "\n", "persona = Cliente()\n", "persona._Cliente__pin # conociendo la nueva variable no da error" ] }, { "cell_type": "markdown", "id": "7eff5ca7", "metadata": { "id": "7eff5ca7" }, "source": [ "## Caso 5\n", "Accediendo, sin problemas, a un método desde fuera de la clase." ] }, { "cell_type": "code", "execution_count": 5, "id": "f31968a0", "metadata": { "id": "f31968a0", "outputId": "5788c2bf-f932-431e-d510-b2814689bc67", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Inversión en valores y derivados.\n" ] } ], "source": [ "class Cliente:\n", " def cuenta(self):\n", " print(\"Inversión en valores y derivados.\")\n", "\n", "persona = Cliente()\n", "persona.cuenta() # podemos acceder al método sin problemas" ] }, { "cell_type": "markdown", "id": "a50b9107", "metadata": { "id": "a50b9107" }, "source": [ "## Caso 6\n", "Los métodos también pueden llevar doble barra baja para intentar protegerse. \n", "Ahora el método cuenta lleva un prefijo de doble barra baja.\n", "\n", "Si intentamos acceder ahora desde dura de la clase se producirá un error." ] }, { "cell_type": "code", "execution_count": 6, "id": "8ceb3bfc", "metadata": { "id": "8ceb3bfc" }, "outputs": [], "source": [ "class Cliente:\n", " def __cuenta(self):\n", " print(\"Inversión en valores y derivados.\")\n", "\n", "persona = Cliente()\n", "#persona.__cuenta() # AttributeError: 'Cliente' object has no attribute '__cuenta'" ] }, { "cell_type": "markdown", "id": "7ac146d5", "metadata": { "id": "7ac146d5" }, "source": [ "## Caso 7\n", "El nombre del método ha sido alterado por el intérprete de Python al encontrar el prefijo de doble barra baja. Si conocemos el nuevo nombre podremos seguir accediendo al método que infructuosamente se ha intentado ocultar.\n", "\n", "* objeto._nombreClase__nombreMetodo()\n", "* persona._Cliente__cuenta()" ] }, { "cell_type": "code", "execution_count": 7, "id": "d086018f", "metadata": { "id": "d086018f", "outputId": "98e6794f-f7fe-4075-9c75-c116727d1067", "colab": { "base_uri": "https://localhost:8080/" } }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "Inversión en valores y derivados.\n" ] } ], "source": [ "class Cliente:\n", " def __cuenta(self):\n", " print(\"Inversión en valores y derivados.\")\n", "\n", "persona = Cliente()\n", "persona._Cliente__cuenta() # conociendo el nuevo nombre del método si accedemos" ] } ], "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_0110.ipynb", "provenance": [], "include_colab_link": true } }, "nbformat": 4, "nbformat_minor": 5 }