From 8450546fd26f1eb8a1297747d5275f697b8ba935 Mon Sep 17 00:00:00 2001 From: Artyom Date: Sat, 6 Dec 2025 22:49:52 +0300 Subject: [PATCH] Added report files --- TEMA9/Employee.py | 63 ++++++++ TEMA9/Mod3.py | 12 ++ TEMA9/SAU.py | 21 +++ TEMA9/main_SAU.py | 19 +++ TEMA9/pictures/figure0.png | Bin 0 -> 26178 bytes TEMA9/pictures/figure1.png | Bin 0 -> 22560 bytes TEMA9/report.md | 300 +++++++++++++++++++++++++++++++++++++ TEMA9/task.md | 141 +++++++++++++++++ 8 files changed, 556 insertions(+) create mode 100644 TEMA9/Employee.py create mode 100644 TEMA9/Mod3.py create mode 100644 TEMA9/SAU.py create mode 100644 TEMA9/main_SAU.py create mode 100644 TEMA9/pictures/figure0.png create mode 100644 TEMA9/pictures/figure1.png create mode 100644 TEMA9/report.md create mode 100644 TEMA9/task.md diff --git a/TEMA9/Employee.py b/TEMA9/Employee.py new file mode 100644 index 0000000..eb320b9 --- /dev/null +++ b/TEMA9/Employee.py @@ -0,0 +1,63 @@ +class Employee: + """Класс, описывающий основные данные о сотруднике организации""" + + def __init__(self, fio = "", otdel = "", dolzhnost = "", oklad = 0): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self.__pooshreniya = [] + self.pooshreniya = property( + self.get_pooshreniya, + self.set_pooshreniya, + self.del_pooshreniya + ) + + def change_oklad(self, diff): + if (self.oklad + diff <= 0): + print("Оклад сотрудника не может быть меньше либо равен 0") + else: + self.oklad += diff + print(f"Оклад сотрудника {self.fio} был {'увеличен' if diff >= 0 else 'уменьшен'} на {abs(diff)}") + + def change_otdel(self, new_otdel): + old_otdel = self.otdel + self.otdel = new_otdel + print(f"Сотрудник {self.fio} был переведен из отдела '{old_otdel}' в '{new_otdel}'") + + def change_dolzhnost(self, new_dolzhnost): + old_dolzhnost = self.dolzhnost + self.dolzhnost = new_dolzhnost + print(f"Должность сотрудника {self.fio} была изменена с '{old_dolzhnost}' на '{new_dolzhnost}'") + + def get_pooshreniya(self): + return list(self.__pooshreniya) + + def set_pooshreniya(self, value): + if isinstance(value, str): + self.__pooshreniya.append(value) + print(f"Добавлено поощрение для сотрудника {self.fio}: '{value}'") + elif isinstance(value, list): + self.__pooshreniya.extend(value) + print(f"Добавлены поощрения для сотрудника {self.fio}: {value}") + else: + print("Поощрение должно быть строкой или списком строк") + + def del_pooshreniya(self, item = ""): + if not item: + self.__pooshreniya.clear() + print(f"Список поощрений сотрудника {self.fio} очищен") + elif item in self.__pooshreniya: + self.__pooshreniya.remove(item) + print(f"Поощрение {item} сотрудника {self.fio} удалено") + else: + print(f"Такого поощрения нет в списке поощрений сотрудника {self.fio}") + + def get_employee_info(self): + print(f""" + ФИО: {self.fio} + Отдел: {self.otdel} + Должность: {self.dolzhnost} + Оклад: {self.oklad} руб. + Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'} + """) diff --git a/TEMA9/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..4ce1489 --- /dev/null +++ b/TEMA9/Mod3.py @@ -0,0 +1,12 @@ +class Class1: + def zad_zn(self, znach): + self.data = znach + def otobrazh(self): + print(self.data) + +class Class2(Class1): + def otobrazh(self): + print("Значение =", self.data) + +def otobrazh(obj): + print("Значение объекта =", obj) diff --git a/TEMA9/SAU.py b/TEMA9/SAU.py new file mode 100644 index 0000000..dcf3ec8 --- /dev/null +++ b/TEMA9/SAU.py @@ -0,0 +1,21 @@ +class SAU: + def __init__ (self, zn_param): + self.param = zn_param + self.ypr = [0, 0] + + def zdn_zn(self, upr): + self.x = upr + + def model(self): + def inerz(x, T, yy): + return (x + T * yy) / (T + 1) + + y0 = self.x - self.ypr[1] * self.param[3] + y1 = self.param[0] * y0 + y2 = inerz(y1, self.param[1], self.ypr[0]) + y3 = inerz(y2, self.param[2], self.ypr[1]) + self.ypr[0] = y2 + self.ypr[1] = y3 + + def otobrazh(self): + print("y =", self.ypr[1]) diff --git a/TEMA9/main_SAU.py b/TEMA9/main_SAU.py new file mode 100644 index 0000000..72d0b60 --- /dev/null +++ b/TEMA9/main_SAU.py @@ -0,0 +1,19 @@ +from SAU import * +prm = [2.5, 4, 1.3, 0.8] +xx = [0] + [1] * 20 +SAUe = SAU(prm) +yt = [] + +for xt in xx: + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobrazh() + yt.append(SAUe.ypr[1]) + +import pylab +pylab.plot(yt) +pylab.title("График выходного сигнала") +pylab.xlabel("Время - t") +pylab.ylabel("Выходной сигнал - y(t)") +pylab.grid(True) +pylab.show() diff --git a/TEMA9/pictures/figure0.png b/TEMA9/pictures/figure0.png new file mode 100644 index 0000000000000000000000000000000000000000..4ecc8f96a91f0bd2a538ffb528c7021b10823610 GIT binary patch literal 26178 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 HEJFVS*tDOF literal 0 HcmV?d00001 diff --git a/TEMA9/pictures/figure1.png b/TEMA9/pictures/figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..1a9e9863d488aacee27f0fe61b5f85d5580fbd51 GIT binary patch literal 22560 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 class Class1: # Объявление класса +... def zad_zn(self, znach): # Метод класса для задания значения поля data +... self.data = znach +... def otobrazh(self): # Метод класса для отображения значения поля data +... print(self.data) +... +>>> z1 = Class1() # Создание 1-го экземпляра класса +>>> z2 = Class1() # Создание 2-го экземпляра класса +>>> z1.zad_zn("Экземпляр класса 1") +>>> z2.zad_zn(-632.453) +>>> z1.otobrazh() + Экземпляр класса 1 +>>> z2.otobrazh() + -632.453 +>>> z1.data = "Новое значение атрибута у экземпляра 1" +>>> z1.otobrazh() + Новое значение атрибута у экземпляра 1 +``` + +#### 2.2. Создание класса-наследника. + +Также классы могут наследоваться от других классов, т.е. иметь такие же поля данных как и класс-родитель и имплементировать его методы, которые можно переопределять. + +```py +>>> class Class2(Class1): # Объявление класса-наследника другого класса +... def otobrazh(self): # Переопределение метода класса-родителя +... print("Значение =", self.data) +... +>>> z3 = Class2() +>>> dir(z3) + ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_zn'] +>>> z3.zad_zn("Совсем новое") +>>> z3.otobrazh() # Сработал переопределенный метод otobrazh класса Class2 + Значение = Совсем новое +>>> z1.otobrazh() # Значение поля data класса Class1 не изменилось + Новое значение атрибута у экземпляра 1 +>>> del z1, z2, z3 +``` + +### 3. Использование классов, содержащихся в модулях. + +Классы могут быть описаны в модулях, которые потом должны быть подключены к основной программе, чтобы реализовать объекты соответствующего класса. Так, например, в модуле __"Mod3.py"__ описано обявление класса Class1: + +```py +class Class1: + def zad_zn(self, znach): + self.data = znach + def otobrazh(self): + print(self.data) + +class Class2(Class1): + def otobrazh(self): + print("Значение =", self.data) + +def otobrazh(obj): + print("Значение объекта =", obj) +``` + +Пример частичного импорта модуля и последующего создания объекта класса Class1: + +```py +>>> from Mod3 import Class1 +>>> z4 = Class1() +>>> z4.otobrazh() # Поле data класса не было инициализировано, поэтому его еще нет в классе + Traceback (most recent call last): + File "", line 1, in + z4.otobrazh() + File "C:\Users\User\Desktop\StepanovAV\python-labs\TEMA9\Mod3.py", line 5, in otobrazh + print(self.data) + AttributeError: 'Class1' object has no attribute 'data' +>>> z4.data = "Значение поля data у экземпляра 4" # Прямая инициализация поля data +>>> z4.otobrazh() # Использован метод для отображения значения поля, описанный в Class1 + Значение поля data у экземпляра 4 +``` + + + +```py +>>> del z4 +>>> import Mod3 +>>> z4 = Mod3.Class2() +>>> z4.zad_zn("Класс из модуля") +>>> z4.otobrazh() # Использован метод для отображения значения поля, описанный в Class2 + Значение = Класс из модуля +>>> Mod3.otobrazh("Объект") # Использована функция otobrazh + Значение объекта = Объект +``` + +### 4. Использование специальных методов. + +Имена специальных методов предваряются одним или двумя подчерками и имеют вид: + __<имя специального метода>__. +Пример класса, содержащего два специальных метода: + +```py +>>> class Class3(Class2): +... def __init__(self, znach): # Специальный метод-конструктор +... self.data = znach +... def __add__(self, another_zn): # Специальный метод для сложения +... return Class3(self.data + another_zn) +... def zad_another_zn(self, povtor): # Обычный пользовательский метод +... self.data *= povtor +... +>>> z5 = Class3("abc") +>>> z5.otobrazh() + Значение = abc +>>> z6 = z5 + "def" +>>> z6.otobrazh() + Значение = abcdef +>>> z6.zad_another_zn(3) +>>> z6.otobrazh() + Значение = abcdefabcdefabcdef +``` + +### 5. Присоединение атрибутов к классу. + +Каждый класс обладает определенными атрибутами, список которыхможно получить с помощью ранее изученной команды __dir()__. + +```py +>>> dir(Class3) + ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_another_zn', 'zad_zn'] +>>> Class3.fio = "Иванов И.И." +>>> z7 = Class3(123) +>>> dir(z7) # Отображение списка атрибутов объекта класса после добавления в него поля fio + ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'zad_another_zn', 'zad_zn'] +>>> dir(z7) == dir(Class3) + False +>>> z7.fio + 'Иванов И.И.' +>>> Class3.fio + 'Иванов И.И.' +>>> z7.rozden = "1987" +>>> "rozden" in dir(z7) # Проверка того, что поле rozden появилось в объекте класса + True +>>> "rozden" in dir(Class3) # Проверка того, что поле rozden не появилось в самом классе + False +``` + +### 6. Выявление родительских классов. + +Чтобы узнать наследуется ли класс от какого-либо другого класса можно рассмотреть атрибут __bases__, который отображает соответствующий родительский класс: + +```py +>>> Class3.__bases__ + (,) +>>> Class2.__bases__ + (,) +>>> Class1.__bases__ + (,) +``` + +Для получения полной цепочки наследований нужно использовать атрибут __mro__: + +```py +>>> Class3.__mro__ + (, , , ) +>>> ZeroDivisionError.__mro__ + (, , , , ) +``` + +### 7. Создание свойств класса. + +Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута. +Пример класса с определенным в нём свойством: + +```py +>>> class Class4: +... def __init__ (self, znach): +... self.__prm = znach +... def chten(self): +... return self.__prm +... def zapis(self, znch): +... self.__prm = znch +... def stiran(self): +... del self.__prm +... svojstvo = property(chten, zapis, stiran) +... +>>> example = Class4(12) +>>> example.svojstvo + 12 +>>> example.svojstvo = 45 +>>> print(example.svojstvo) + 45 +>>> del example.svojstvo +>>> example.svojstvo # Отображения отсутсвующего в объекте класса свойства вызывает ошибку + Traceback (most recent call last): + File "", line 1, in + example.svojstvo + File "", line 5, in chten + return self.__prm + AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` + +### 8. Представление некоторой модели в виде класса. + +Различные модели можно представлять в виде отдельных классов. Пример создания класса для модели, состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем, представлен ниже. + +Содержимое модуля __SAU.py__ с классом __SAU__: + +```py +class SAU: + def __init__ (self, zn_param): + self.param = zn_param + self.ypr = [0, 0] + + def zdn_zn(self, upr): + self.x = upr + + def model(self): + def inerz(x, T, yy): + return (x + T * yy) / (T + 1) + + y0 = self.x - self.ypr[1] * self.param[3] # Обратная связь с усилителем 2 + y1 = self.param[0] * y0 # Усилитель 1 + y2 = inerz(y1, self.param[1], self.ypr[0]) # Инерционное звено 1 + y3 = inerz(y2, self.param[2], self.ypr[1]) # Инерционное звено 2 + self.ypr[0] = y2 + self.ypr[1] = y3 + + def otobrazh(self): + print("y =", self.ypr[1]) +``` + +Содержимое модуля-программы __main_SAU.py__ с тестированием класса: + +```py +from SAU import * +prm = [2.5, 4, 1.3, 0.8] # Параметры модели: K1, T1, T2, K2 +xx = [0] + [1] * 20 # Входной сигнал – «ступенька» +SAUe = SAU(prm) +yt = [] + +for xt in xx: + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobrazh() + yt.append(SAUe.ypr[1]) + +import pylab +pylab.plot(yt) +pylab.title("График выходного сигнала") +pylab.xlabel("Время - t") +pylab.ylabel("Выходной сигнал - y(t)") +pylab.grid(True) +pylab.show() +``` + +Результат выполнения программы и построенный график: + +```py +>>> import main_SAU + y = 0.0 + y = 0.2173913043478261 + y = 0.4763705103969754 + y = 0.686594887811293 + y = 0.8199324616478645 + y = 0.8837201137353929 + y = 0.8994188484874774 + y = 0.8892777072047301 + y = 0.870097963179993 + y = 0.8518346102696789 + y = 0.8387499784485772 + y = 0.8314204114211459 + y = 0.8286051955249649 + y = 0.8285656555914835 + y = 0.8297915186846528 + y = 0.8312697736438287 + y = 0.8324765218921963 + y = 0.8332456979978418 + y = 0.8336163607592184 + y = 0.8337101315489143 + y = 0.833654237067147 +``` + +![Скриншот построенного графика](pictures/figure1.png) + +### 9. Завершение работы со средой. + +Сохранил файлы отчета в своем рабочем каталоге и закончил сеанс работы с IDLE. diff --git a/TEMA9/task.md b/TEMA9/task.md new file mode 100644 index 0000000..c8bb01a --- /dev/null +++ b/TEMA9/task.md @@ -0,0 +1,141 @@ +# Общее контрольное задание по теме 9 + +Степанов Артём, А-02-23 + +## Задание + +Создайте и запишите в модуль класс, содержащий следующие компоненты: +* конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; +* метод для обеспечения операции повышения оклада сотрудника на заданное значение; +* метод для обеспечения перевода сотрудника из одного отдела в другой; +* метод для изменения должности сотрудника; +* свойство, содержащее перечень (список) поощрений сотрудника. + +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности. + +## Решение + +Содержимое модуля __Employee.py__: + +```py +class Employee: + """Класс, описывающий основные данные о сотруднике организации""" + + def __init__(self, fio = "", otdel = "", dolzhnost = "", oklad = 0): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self.__pooshreniya = [] + self.pooshreniya = property( + self.get_pooshreniya, + self.set_pooshreniya, + self.del_pooshreniya + ) + + def change_oklad(self, diff): + if (self.oklad + diff <= 0): + print("Оклад сотрудника не может быть меньше либо равен 0") + else: + self.oklad += diff + print(f"Оклад сотрудника {self.fio} был {'увеличен' if diff >= 0 else 'уменьшен'} на {abs(diff)}") + + def change_otdel(self, new_otdel): + old_otdel = self.otdel + self.otdel = new_otdel + print(f"Сотрудник {self.fio} был переведен из отдела '{old_otdel}' в '{new_otdel}'") + + def change_dolzhnost(self, new_dolzhnost): + old_dolzhnost = self.dolzhnost + self.dolzhnost = new_dolzhnost + print(f"Должность сотрудника {self.fio} была изменена с '{old_dolzhnost}' на '{new_dolzhnost}'") + + def get_pooshreniya(self): + return list(self.__pooshreniya) + + def set_pooshreniya(self, value): + if isinstance(value, str): + self.__pooshreniya.append(value) + print(f"Добавлено поощрение для сотрудника {self.fio}: '{value}'") + elif isinstance(value, list): + self.__pooshreniya.extend(value) + print(f"Добавлены поощрения для сотрудника {self.fio}: {value}") + else: + print("Поощрение должно быть строкой или списком строк") + + def del_pooshreniya(self, item = ""): + if not item: + self.__pooshreniya.clear() + print(f"Список поощрений сотрудника {self.fio} очищен") + elif item in self.__pooshreniya: + self.__pooshreniya.remove(item) + print(f"Поощрение '{item}' сотрудника {self.fio} удалено") + else: + print(f"Такого поощрения нет в списке поощрений сотрудника {self.fio}") + + def get_employee_info(self): + print(f""" + ФИО: {self.fio} + Отдел: {self.otdel} + Должность: {self.dolzhnost} + Оклад: {self.oklad} руб. + Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'} + """) +``` + +Проверка класса на работоспособность: + +```py +>>> from Employee import Employee +>>> employee1 = Employee("Иванов И.И.", "IT-отдел", "Программист", 75000) +>>> employee2 = Employee("Смирнов С.С.", "Отдел продаж", "Менеджер", 50000) +>>> employee1.get_employee_info() # Отображение полной информации об экземпляре класса + + ФИО: Иванов И.И. + Отдел: IT-отдел + Должность: Программист + Оклад: 75000 руб. + Поощрения: нет + +>>> employee2.get_employee_info() + + ФИО: Смирнов С.С. + Отдел: Отдел продаж + Должность: Менеджер + Оклад: 50000 руб. + Поощрения: нет + +>>> employee1.change_otdel("Административный отдел") # Изменение отдела + Сотрудник Иванов И.И. был переведен из отдела 'IT-отдел' в 'Административный отдел' +>>> employee2.change_oklad(-5000) # Изменение оклада (отрицательное число) + Оклад сотрудника Смирнов С.С. был уменьшен на 5000 +>>> employee2.change_oklad(7500) # Изменение оклада (положительное число) + Оклад сотрудника Смирнов С.С. был увеличен на 7500 +>>> employee2.change_dolzhnost("Аналитик продаж") # Изменение должности +>>> Должность сотрудника Смирнов С.С. была изменена с 'Менеджер' на 'Аналитик продаж' +>>> employee1.set_pooshreniya("Почетная грамота") # Добавление поощрения + Добавлено поощрение для сотрудника Иванов И.И.: 'Почетная грамота' +>>> employee1.set_pooshreniya(["Медаль", "Сертификат"]) # Добавление списка поощрений + Добавлены поощрения для сотрудника Иванов И.И.: ['Медаль', 'Сертификат'] +>>> employee1.get_pooshreniya() # Отображение списка поощрений + ['Почетная грамота', 'Медаль', 'Сертификат'] +>>> employee1.del_pooshreniya("Медаль") # Удаление определенного поощрения + Поощрение 'Медаль' сотрудника Иванов И.И. удалено +>>> employee1.del_pooshreniya() # Удаление всех поощрений + Список поощрений сотрудника Иванов И.И. очищен +>>> employee1.get_employee_info() + + ФИО: Иванов И.И. + Отдел: Административный отдел + Должность: Программист + Оклад: 75000 руб. + Поощрения: нет + +>>> employee2.get_employee_info() + + ФИО: Смирнов С.С. + Отдел: Отдел продаж + Должность: Аналитик продаж + Оклад: 52500 руб. + Поощрения: нет +``` \ No newline at end of file