Skip to content

Instantly share code, notes, and snippets.

@moonzlo
Created January 5, 2019 21:09
Show Gist options
  • Select an option

  • Save moonzlo/0d4380416e155a8d4bfdaa2dc3089058 to your computer and use it in GitHub Desktop.

Select an option

Save moonzlo/0d4380416e155a8d4bfdaa2dc3089058 to your computer and use it in GitHub Desktop.
note
Display the source blob
Display the rendered blob
Raw
{
"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