Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753

Как работает инкапсуляция?

16.02.2021, 08:28. Показов 1595. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Набрал пример из видео. Выдает:
Code
1
AttributeError: 'Kettle' object has no attribute '_turn_off
Это пример работы чайника, который имитирует нажатие кнопки включения, запускающей через одну функцию my_kettle.turn_on() остальные функции. А при использовании инкапсуляции другие функции нельзя запустить непосредственно, а только посредством этой кнопки, так как у пользователя чайника нет дополнительных кнопок.
А запуск через my_kettle._turn_off() функции показывает, как если бы надо было экстренно отключить чайник от электрической сети (возможно выдергиванием вилки из розетки).
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Kettle:
 
    def turn_on(self):
        print('Нажали кнопку')
        self.__boil()
        self.__check_temperature()
        self.__beep()
        self.__turn_off()
 
    def __boil(self):
        print('Разогревание воды')
 
    def __check_temperature(self):
        print('Проверяем температуру воды')
 
    def __beep(self):
        print('Подаем звуковой сигнал')
 
    def __turn_off(self):
        print('Автоматическое выключение')
 
 
my_kettle = Kettle()
#my_kettle.__beep()
#my_kettle.__boil()
#my_kettle.turn_on()
my_kettle._turn_off()
Добавлено через 1 минуту
Python 3.9 в Windows 10.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2021, 08:28
Ответы с готовыми решениями:

Почему не работает инкапсуляция?
#include <iostream> #include <string> using namespace std; class Pixel { private: int r; int g; int b;

Скажите как Инкапсуляция применяется в программе
Добрый вечер:) Скажите пожалуйста как "Принцип Инкапсуляции" (объектно-ориентированное программирование) применяется в программе? Вот...

Инкапсуляция или как правильно отделить логику
Делаю проект в WPF(но это не важно). Вопрос таков: может ли класс где обработчики всех событий формы, иметь переменную(другой класс, в...

12
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
16.02.2021, 08:34
На то она и инкапсуляция чтобы её нельзя было вызвать вне класса
__ - это приватный доступ

Вне класса только эту функцию можешь вызвать
Python
1
my_kettle.turn_on()
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
16.02.2021, 08:43
Лучший ответ Сообщение было отмечено Arsegg как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Kettle:
 
    def turn_on(self):
        print('Нажали кнопку')
        self.__boil()
        self.__check_temperature()
        self.__beep()
        self.__turn_off()
 
    def __boil(self):
        print('Разогревание воды')
 
    def __check_temperature(self):
        print('Проверяем температуру воды')
 
    def __beep(self):
        print('Подаем звуковой сигнал')
 
    def __turn_off(self):
        print('Автоматическое выключение')
 
 
my_kettle = Kettle()
# my_kettle.__beep()
# my_kettle.__boil()
# my_kettle.turn_on()
my_kettle._Kettle__turn_off()  # Автоматическое выключение
1
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.02.2021, 11:18
Цитата Сообщение от RSAX Посмотреть сообщение
На то она и инкапсуляция чтобы её нельзя было вызвать вне класса
вы ошибаетесь, в питоне это не так работает, вызвать можно все.

Цитата Сообщение от supmener Посмотреть сообщение
has no attribute '_turn_off
так у тебя атрибут с двумя подсчеркиваниями, а не с 1. В таких случаях питон использует подстановку, как выше ДмФат показал.
2
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
16.02.2021, 15:08
Welemir1, Да я увидел уже как можно вызвать, я к тому что напрямую, вот так - my_kettle.__turn_off(), работать не будет и надо писать my_kettle._Kettle__turn_off()

Добавлено через 11 минут
Welemir1, Хотя не совсем и ошибаюсь, питон тоже предупреждает что получен доступ к защищённой функции и по правилам так не стоит делать
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.02.2021, 15:51
Цитата Сообщение от RSAX Посмотреть сообщение
питон тоже предупреждает что получен доступ к защищённой функции и по правилам так не стоит делать
никак не предупреждает. То что он меняет имя name_mangling не связано с его попыткой сокрыть данные, но можешь поискать зачем конкретно это сделано, это интересно.
0
102 / 85 / 25
Регистрация: 21.05.2019
Сообщений: 481
16.02.2021, 15:56
Welemir1, В смысле не предупреждает, вот что он пишет "Access to a protected member _Kettle__turn_off of a class "
Версия у вас может старая
Ошибки и нет, всё работает, просто предупреждение
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.02.2021, 16:03
RSAX, где пишет, что вы для этого делаете? версия ос и питона какие?

Добавлено через 38 секунд
а, вы про варнинг пичарма? так это не предупреждение самоего питона, это стороннее приложение.

Добавлено через 1 минуту
Варнинг верный, нечего лезть за скрытыми переменными, я просто пытаюсь донести что сам питон не только не препятствует, но всячески способствует тому, чтобы вытащить все что угодно.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
16.02.2021, 16:09
Цитата Сообщение от Welemir1 Посмотреть сообщение
Варнинг верный, нечего лезть за скрытыми переменными, я просто пытаюсь донести что сам питон не только не препятствует, но всячески способствует тому, чтобы вытащить все что угодно.
- достаточно интересно, что правоверные ООПперы сначала до посинения накручивали инкапсуляцию, приватность и т.п., чтобы однажды осознать, что несколько "переусердствовали". В результате, к примеру, в Java появилась рефлексия (местами инкапсуляции сильно противоречащая). Привет от Гегеля с его диалектической спиралью!
0
16.02.2021, 16:13

Не по теме:

Welemir1, да пучарм, про сам питон понял, что он не ругается

0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.02.2021, 16:19
Catstail, отличный пример, согласен! Давайте все заприватим, чтобы потом написать сеттер и геттер, позволяющие все изменить и получить. Зато многие собирают хайп на митапах сейчас по джаве просто говоря -не пишите сеттеров и геттеров, делайте паблик поля и т.п.)
Насколько в этом отношении прост и понятен питон - не знаешь? не лезь! вот даже пометка для тебя висит (_) что дальше сам дурак. Но вот если ты понимаешь что делаешь -то пожалуйста, доступ открыт всегда, не нужно через рефлексию получать метод и делать его паблик.

Добавлено через 1 минуту
RSAX, поймите правильно, я не призываю трогать атрибуты с _, наоборот, это как раз сигнал не лезть. Я лишь хотел подчеркнуть что сам питон не препятствует пытливому уму и шаловливым ручкам)
2
16.02.2021, 16:27

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
чтобы однажды осознать, что несколько "переусердствовали".
Видел где то на просторах (сильно сокращенное творение):
Python
1
2
3
4
5
6
7
class Calculate:
    
    def __add(self, a: int, b: int) -> int:
        return a + b
 
    def add(self, a: int, b: int) -> int:
        return self.__add(a, b)

0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,753
17.02.2021, 19:40  [ТС]
Цитата Сообщение от DmFat Посмотреть сообщение
Видел где то на просторах (сильно сокращенное творение):
Python
1
2
3
4
5
6
7
8
9
10
11
12
class Calculate:
 
    def __add(self, a: int, b: int) -> int:
        return a + b
 
    def add(self, a: int, b: int) -> int:
        return self.__add(a, b)
 
ops = Calculate()
print(ops.add(5, 7)) #12
 
print(ops._Calculate__add(2, 4)) #6
Добавлено через 5 минут
Ещё какой - то вариант я не дописал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.02.2021, 19:40
Помогаю со студенческими работами здесь

Интерфейсы и инкапсуляция данных, как наследоваться так, чтобы можно было сохранить нужные переменные приватными
если я верно понял принцип наследования в шарпе, то: к примеру, будут у меня дочерние классы наследоваться от некоторых интерфейсов,...

Инкапсуляция
import random class Pasvagon(): def __init__(self, name, capacity, procent): self.__name = name ...

Инкапсуляция
Я понял, что такое инкапсуляция. Понял что такое сеттер, и для чего он работает. Но для чего геттер? Он возвращает значение? Какое...

Инкапсуляция
Помогите решить... пожалуйста... Описать класс по следующим протоколом. Сохранить описания каждого класса в отдельном модуле. ...

Инкапсуляция
1. Создать класс MobPhone (мобильный телефон), который будет содержать поля с открытым доступом: brand, size_h, size_w, price и метод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru