From 8771f84b1c099307f5cdaf21c2eee642fc564835 Mon Sep 17 00:00:00 2001 From: SneguraDS Date: Sun, 9 Nov 2025 18:49:07 +0300 Subject: [PATCH] lab9 --- TEMA9/employee_module.py | 19 +++++++++++-------- TEMA9/obshee.md | 39 +++++++++++++++++++-------------------- TEMA9/report.md | 21 +++++++++++---------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/TEMA9/employee_module.py b/TEMA9/employee_module.py index 4a1a6b0..4accccd 100644 --- a/TEMA9/employee_module.py +++ b/TEMA9/employee_module.py @@ -13,6 +13,11 @@ class Employee: self.dolzhnost = dolzhnost self.oklad = oklad self.__pooshreniya = [] # приватный атрибут для хранения поощрений + + # Создаем свойство без декораторов + self.pooshreniya = property(self._get_pooshreniya, + self._set_pooshreniya, + self._del_pooshreniya) def povysit_oklad(self, summa): """ @@ -40,14 +45,12 @@ class Employee: self.dolzhnost = novaya_dolzhnost print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'") - # Свойство для работы с поощрениями - @property - def pooshreniya(self): + # Методы для свойства pooshreniya (вместо декораторов) + def _get_pooshreniya(self): """Геттер для получения списка поощрений""" return self.__pooshreniya - @pooshreniya.setter - def pooshreniya(self, value): + def _set_pooshreniya(self, value): """Сеттер для добавления нового поощрения""" if isinstance(value, str): self.__pooshreniya.append(value) @@ -58,8 +61,7 @@ class Employee: else: print("Поощрение должно быть строкой или списком строк") - @pooshreniya.deleter - def pooshreniya(self): + def _del_pooshreniya(self): """Делитер для очистки списка поощрений""" self.__pooshreniya.clear() print(f"Список поощрений сотрудника {self.fio} очищен") @@ -82,6 +84,7 @@ class Employee: print(f"Оклад: {self.oklad} руб.") print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}") + # Демонстрационная программа if __name__ == "__main__": print("Демонстрация работы класса EMPLOYEE\n") @@ -127,4 +130,4 @@ if __name__ == "__main__": del sotrudnik2.pooshreniya sotrudnik2.otobrazit_informaciyu() - print("\nДемострация завершена") + print("\nДемонстрация завершена") \ No newline at end of file diff --git a/TEMA9/obshee.md b/TEMA9/obshee.md index 15af9c5..2cb67d8 100644 --- a/TEMA9/obshee.md +++ b/TEMA9/obshee.md @@ -18,6 +18,11 @@ class Employee: self.dolzhnost = dolzhnost self.oklad = oklad self.__pooshreniya = [] # приватный атрибут для хранения поощрений + + # Создаем свойство без декораторов + self.pooshreniya = property(self._get_pooshreniya, + self._set_pooshreniya, + self._del_pooshreniya) def povysit_oklad(self, summa): """ @@ -45,14 +50,12 @@ class Employee: self.dolzhnost = novaya_dolzhnost print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'") - # Свойство для работы с поощрениями - @property - def pooshreniya(self): + # Методы для свойства pooshreniya (вместо декораторов) + def _get_pooshreniya(self): """Геттер для получения списка поощрений""" return self.__pooshreniya - @pooshreniya.setter - def pooshreniya(self, value): + def _set_pooshreniya(self, value): """Сеттер для добавления нового поощрения""" if isinstance(value, str): self.__pooshreniya.append(value) @@ -63,8 +66,7 @@ class Employee: else: print("Поощрение должно быть строкой или списком строк") - @pooshreniya.deleter - def pooshreniya(self): + def _del_pooshreniya(self): """Делитер для очистки списка поощрений""" self.__pooshreniya.clear() print(f"Список поощрений сотрудника {self.fio} очищен") @@ -87,6 +89,7 @@ class Employee: print(f"Оклад: {self.oklad} руб.") print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}") + # Демонстрационная программа if __name__ == "__main__": print("Демонстрация работы класса EMPLOYEE\n") @@ -132,7 +135,7 @@ if __name__ == "__main__": del sotrudnik2.pooshreniya sotrudnik2.otobrazit_informaciyu() - print("\nДемострация завершена") + print("\nДемонстрация завершена") ``` ## Получу следующее: ```py @@ -158,21 +161,19 @@ if __name__ == "__main__": 3. Операции с первым сотрудником: Оклад сотрудника Петров Алексей Сергеевич повышен на 10000. Новый оклад: 60000 -Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки' +Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки' Сотрудник Петров Алексей Сергеевич переведен с должности 'Программист' на должность 'Старший программист' -Добавлено поощрение для Петров Алексей Сергеевич: 'Благодарность за успешный проект' -Добавлено поощрение для Петров Алексей Сергеевич: 'Премия за квартал' ФИО: Петров Алексей Сергеевич Отдел: Отдел разработки Должность: Старший программист Оклад: 60000 руб. -Поощрения: ['Благодарность за успешный проект', 'Премия за квартал'] +Поощрения: нет 4. Операции со вторым сотрудником: Оклад сотрудника Сидорова Мария Петровна повышен на 5000. Новый оклад: 80000 -Сотрудник Сидорова Мария Петровна переведен из отдела 'Бухгалтерия' в отдел 'Финансовый отдел' +Сотрудник Сидорова Мария Петровна переведен из отдела 'Бухгалтерия' в отдел 'Финансовый отдел' Добавлено поощрение для Сидорова Мария Петровна: 'Благодарность за годовой отчет' @@ -183,28 +184,26 @@ if __name__ == "__main__": Поощрения: ['Благодарность за годовой отчет'] 5. Работа со свойствами: -Поощрения Петров Алексей Сергеевич: ['Благодарность за успешный проект', 'Премия за квартал'] -Поощрения Сидорова Мария Петровна: ['Благодарность за годовой отчет'] +Поощрения Петров Алексей Сергеевич: Премия за квартал +Поощрения Сидорова Мария Петровна: 6. Добавление нескольких поощрений: -Добавлены поощрения для Петров Алексей Сергеевич: ['Почетная грамота', 'Ценный подарок'] ФИО: Петров Алексей Сергеевич Отдел: Отдел разработки Должность: Старший программист Оклад: 60000 руб. -Поощрения: ['Благодарность за успешный проект', 'Премия за квартал', 'Почетная грамота', 'Ценный подарок'] +Поощрения: нет 7. Очистка поощрений: -Список поощрений сотрудника Сидорова Мария Петровна очищен ФИО: Сидорова Мария Петровна Отдел: Финансовый отдел Должность: Главный бухгалтер Оклад: 80000 руб. -Поощрения: нет +Поощрения: ['Благодарность за годовой отчет'] -Демострация завершена +Демонстрация завершена ``` \ No newline at end of file diff --git a/TEMA9/report.md b/TEMA9/report.md index 014e33f..1832574 100644 --- a/TEMA9/report.md +++ b/TEMA9/report.md @@ -1,7 +1,7 @@ # 1. Запустили интерактивную оболочку IDLE, открыли окно текстового редактора # 2. Создание классов и их наследников ## 2.1. Создание автономного класса -#### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы +### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы ```py class Class1: #Объявление класса def zad_zn(self,znach): #Метод 1 класса1 – задание значения data @@ -45,7 +45,7 @@ class Class2(Class1): #Class2 - наследник класса Class1 ```py z3=Class2() ``` -### Посмотрим список его атрибутов +### Посмотрю список его атрибутов ```py dir(z3) ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_zn'] @@ -54,13 +54,13 @@ dir(z3) ```py z3.zad_zn('Совсем новое') ``` -### Отобразите его для контроля +### Отображу его для контроля ```py z3.otobrazh() значение= Совсем новое ``` -### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализируем, метод какого класса сработал при выводе этого значения. -### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод +#### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализирую, метод какого класса сработал при выводе этого значения. +#### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод ### Для проверки отображу значение данного data у первого экземпляра первого класса ```py @@ -91,7 +91,7 @@ Traceback (most recent call last): AttributeError: 'Class1' object has no attribute 'data' ``` #### Ошибка возникла потому, что у экземпляра z4 не был определен атрибут data. При запуске происходит следующее: создается экземпляр z4 класса Class1; вызывается метод otobrazh(), который пытается выполнить print(self.data); но атрибут data еще не был создан, так как метод zad_zn() никогда не вызывался -### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data +#### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data ### Попробую иначе ```py @@ -119,8 +119,8 @@ Mod3.otobrazh('Объект') #### Ключевые различия: метод класса работает с атрибутами экземпляра (self.data), самостоятельная функция работает с переданным ей аргументом (objekt), класс Class2 переопределил метод otobrazh, добавив префикс "значение=", разные способы импорта (from Mod3 import Class1 vs import Mod3) влияют на пространство имен # 4. Использование специальных методов -### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ -### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным +#### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ +#### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным ### Cоздам класс, содержащий два специальных метода ```py @@ -227,7 +227,7 @@ ZeroDivisionError.__mro__ ``` # 7. Создание свойства класса. -### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута +#### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута ### Создам новый класс с определенным в нем свойством. Здесь имеется 3 метода: chten, zapis, stiran, которые обслуживают созданное свойство, реализуя операции, соответственно, чтения, записи или удаления значений свойства ```py class Class4: @@ -260,7 +260,7 @@ AttributeError: 'Class4' object has no attribute '_Class4__prm' ``` #### Полученный результат и объяснение: после выполнения del exempl.svojstvo происходит следующее: вызывается метод stiran, который выполняет del sam.__prm; удаляется приватный атрибут __prm у экземпляра; при последующей попытке чтения exempl.svojstvo: вызывается метод chten; метод пытается вернуть sam.__prm; но атрибут __prm уже удален; возникает ошибка AttributeError -# 8. Рассмотрите пример представления в виде класса модели системы автоматического регулиро-вания (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. +# 8. Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. ### Создам модуль SAU.py с классом ![alt text]({320D0C4C-177D-4114-B480-E6A8F4141636}.png) ### Тестирование класса произведу с помощью следующей программы: @@ -289,4 +289,5 @@ y= 0.8336163607592184 y= 0.8337101315489143 y= 0.833654237067147 ``` +### Построился график переходного процесса системы ![alt text]({82D74A71-F422-40D3-B0B4-C48328364C87}.png)