Created
January 5, 2019 21:09
-
-
Save moonzlo/0d4380416e155a8d4bfdaa2dc3089058 to your computer and use it in GitHub Desktop.
note
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "В данном пример продемонстрирована работа инкапсуляции." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 29, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Класс лампочка имеет два метода (Включена и Выключена)\n", | |
| "class Lamp:\n", | |
| " def __init__(self, floor=0): # Определяем стартовое значения каждого экземпляра.\n", | |
| " self.state = False\n", | |
| " self.floor = floor # Этаж размещения =) \n", | |
| " # Что бы иметь возможность Включить лампочку, она должна быть Выключина\n", | |
| " \n", | |
| " \n", | |
| " def switch_on(self):\n", | |
| " if not self.state: # Условие: Если ПРИ обращении к методу класса, состояние ламочки False\n", | |
| " # Тогда её свойвство state меняеться на True.\n", | |
| " self.state = True\n", | |
| " print('Включили лампочку')\n", | |
| " \n", | |
| " def switch_off(self):\n", | |
| " if self.state:\n", | |
| " print('Выключили лампочку')\n", | |
| " self.state = False \n", | |
| " \n", | |
| " def __repr__(self): # Приводим к сттроке. (аналогично __str__)\n", | |
| " return f'Я лампочка на {self.floor} этаже '" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Создаём экземпляры класс с параметром этажа." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 30, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Включили лампочку\n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "# Создаем два экземпляра класса Lamp \n", | |
| "lamp1 = Lamp(1)\n", | |
| "lamp2 = Lamp(2)\n", | |
| "\n", | |
| "# Передаем сообщение о Включении лампочки ! \n", | |
| "lamp2.switch_on()" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 31, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "False\n", | |
| "True\n", | |
| "2\n", | |
| "Я лампочка на 2 этаже \n" | |
| ] | |
| } | |
| ], | |
| "source": [ | |
| "print(lamp1.state)\n", | |
| "\n", | |
| "# Экземпляр класса Lamp внутри переменной lamp2 изменил свойвство\n", | |
| "print(lamp2.state)\n", | |
| "print(lamp2.floor) # На каком этаже лампа ?!\n", | |
| "print(lamp2) # Вызвыаем функцию в виде строки." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "__Инициируем инкапсуляцию.\n", | |
| "\n", | |
| "Если перед название (функции,объекта,класса) указать только одно подчёркивание, это создат ТОЛЬКО визуальное представление о том что содержмиое трогать НЕ стоит, но ФИЗИЧИСКИ это возможно. Пример _name \n", | |
| "\n", | |
| "В том случа если перед имением объекта ДВА подчёркивания, тогда доступ возможен только изнутри __name " | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 161, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "# Класс лампочка c ограничением доступа из ВНЕ.\n", | |
| "class Lamp:\n", | |
| " def __init__(self, floor=0):\n", | |
| " self.__state = False # Используем метод ФИЗИЧЕСКОЙ инкапсуляции.\n", | |
| " self.__floor = floor\n", | |
| " \n", | |
| " def get_state(self):\n", | |
| " return self.__state\n", | |
| " \n", | |
| " # Создаем атрибут класса Чтения значения метода !\n", | |
| " state = property(get_state)\n", | |
| " \n", | |
| " \n", | |
| " \n", | |
| " def get_floor(self): # Получаем данные.\n", | |
| " return self.__floor\n", | |
| " \n", | |
| " def set_floor(self, value): # Меняем значение.\n", | |
| " self.__floor = value # Меняем за полученное value.\n", | |
| " \n", | |
| " floor = property(get_floor, set_floor) # Прежде всего идет Гетр а потом Сетер. \n", | |
| " # Данная конструкция позволяет ловить обращения и обрабатывать их нужным образом.\n", | |
| " \n", | |
| " \n", | |
| " \n", | |
| " def switch_on(self):\n", | |
| " if not self.state:\n", | |
| " self.state = True\n", | |
| " print('Включили лампочку')\n", | |
| " \n", | |
| " def switch_off(self):\n", | |
| " if self.state:\n", | |
| " print('Выключили лампочку')\n", | |
| " self.state = False \n", | |
| " \n", | |
| " def __repr__(self):\n", | |
| " return f'Я лампочка на {self.floor} этаже '" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 166, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Я лампочка на 3 этаже \n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "False" | |
| ] | |
| }, | |
| "execution_count": 166, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "lamp1 = Lamp(2)\n", | |
| "lamp1.get_state()\n", | |
| "\n", | |
| "lamp1.set_floor(1) # Первый способ обращения\n", | |
| "lamp1.floor = 3 # Второй способ\n", | |
| "print(lamp1)\n", | |
| "\n", | |
| "# Пробуем изменить значение.\n", | |
| "lamp1.__state = True\n", | |
| "\n", | |
| "# Обращаемся к атрибуту Функции.\n", | |
| "lamp1.state" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": {}, | |
| "source": [ | |
| "Применение !" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 22, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [ | |
| "class Lamp:\n", | |
| " def __init__(self, floor=0):\n", | |
| " self.__state = False # Используем метод ФИЗИЧЕСКОЙ инкапсуляции.\n", | |
| " self.__floor = floor\n", | |
| " \n", | |
| " def get_state(self):\n", | |
| " return self.__state\n", | |
| " \n", | |
| " \n", | |
| " # ========================== [УДОБСТВО ОБРАЩЕНИЯ ]============================================\n", | |
| " state = property(get_state) # Данная конструкция даёт доступ ИСКЛЧИТЕЛЬНО на получение СТАТУСА\n", | |
| " \n", | |
| " \n", | |
| " \n", | |
| " def get_floor(self): # Получаем данные.\n", | |
| " return self.__floor\n", | |
| " \n", | |
| " def set_floor(self, value): # Меняем значение.\n", | |
| " self.__floor = value # Меняем за полученное value.\n", | |
| " \n", | |
| " floor = property(get_floor, set_floor) # Прежде всего идет Гетр а потом Сетер. \n", | |
| " # Данная конструкция позволяет ловить обращения и обрабатывать их нужным образом.\n", | |
| " \n", | |
| " \n", | |
| " \n", | |
| " def switch_on(self):\n", | |
| " if not self.__state:\n", | |
| " self.__state = True\n", | |
| " print('Включили лампочку')\n", | |
| " \n", | |
| " def switch_off(self):\n", | |
| " if self.__state:\n", | |
| " print('Выключили лампочку')\n", | |
| " self.__state = False \n", | |
| " \n", | |
| " def __repr__(self):\n", | |
| " return f'Я лампочка на {self.floor} этаже ' # Обращаемся не напрямую, а через property" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "outputs": [ | |
| { | |
| "name": "stdout", | |
| "output_type": "stream", | |
| "text": [ | |
| "Состояние лампочки False\n", | |
| "Включили лампочку\n", | |
| "Состояние лампочки True\n", | |
| "Сейчас я на: 1 этаже\n", | |
| "3\n" | |
| ] | |
| }, | |
| { | |
| "data": { | |
| "text/plain": [ | |
| "Я лампочка на 3 этаже " | |
| ] | |
| }, | |
| "execution_count": 24, | |
| "metadata": {}, | |
| "output_type": "execute_result" | |
| } | |
| ], | |
| "source": [ | |
| "lampa1 = Lamp(1) # Создаем лампу на первом этаже\n", | |
| "\n", | |
| "print('Состояние лампочки', lampa1.state) # Выводим состояние через property\n", | |
| "\n", | |
| "# Пробуем изменить состояние лампочки через СВОЙВСТВО КЛАССА property \n", | |
| "# lampa1.state = True \n", | |
| "# Такая попытка выдаст ошибку \"AttributeError: can't set attribute\" \n", | |
| "\n", | |
| "lampa1.switch_on() # ПРАВИЛЬНО включаем лампочку =)\n", | |
| "print('Состояние лампочки', lampa1.state)\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "\n", | |
| "# Если обращаться к конструкции для получения, сработает первый метод GET если на измнеение то SET\n", | |
| "print('Сейчас я на:',lampa1.floor, 'этаже')\n", | |
| "\n", | |
| "\n", | |
| "lampa1.floor = 3 # При таком вызове уже срабатывает SET и значение меняется.\n", | |
| "print(lampa1.floor)\n", | |
| "\n", | |
| "lampa1 # Вызываем работу __repr__\n", | |
| "# Он должен вернуть нам строковое значение." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "execution_count": null, | |
| "metadata": {}, | |
| "outputs": [], | |
| "source": [] | |
| } | |
| ], | |
| "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.6.4" | |
| } | |
| }, | |
| "nbformat": 4, | |
| "nbformat_minor": 2 | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment