From 0dec7f90aaae3866f99a9c468cde41bc7ce9ba4a Mon Sep 17 00:00:00 2001 From: VatariShin Date: Fri, 19 Dec 2025 10:16:22 +0300 Subject: [PATCH] done lab9 --- TEMA9/Figure_1.png | Bin 0 -> 14380 bytes TEMA9/Mod3.py | 10 ++ TEMA9/SAU.py | 21 ++++ TEMA9/employee_module.py | 30 +++++ TEMA9/main.py | 25 +++++ TEMA9/report.md | 230 +++++++++++++++++++++++++++++++++++++++ TEMA9/task.md | 98 +++++++++++++++++ TEMA9/test_SAU.py | 14 +++ 8 files changed, 428 insertions(+) create mode 100644 TEMA9/Figure_1.png create mode 100644 TEMA9/Mod3.py create mode 100644 TEMA9/SAU.py create mode 100644 TEMA9/employee_module.py create mode 100644 TEMA9/main.py create mode 100644 TEMA9/report.md create mode 100644 TEMA9/task.md create mode 100644 TEMA9/test_SAU.py diff --git a/TEMA9/Figure_1.png b/TEMA9/Figure_1.png new file mode 100644 index 0000000000000000000000000000000000000000..eaa023bd7e9687a9aa5c0653fd0f77a4d2b8c181 GIT binary patch literal 14380 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 Qtbx>3v~Pb_vVQVk06%q0lmGw# literal 0 HcmV?d00001 diff --git a/TEMA9/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..03939c4 --- /dev/null +++ b/TEMA9/Mod3.py @@ -0,0 +1,10 @@ +class Class1: #Объявление класса Class1 в модуле + def zad_zn(self,znach): # 1 Метод класса + self.data=znach # self - ссылка на экземпляр класса Class1 + def otobrazh(self): # 2 Метод класса + print(self.data)#Отображение данных экземпляра +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 + print('значение=',self.data)#Отображение данных экземпляра +def otobrazh(objekt): #Объявление самостоятельной функции + print('значение объекта=',objekt) \ No newline at end of file diff --git a/TEMA9/SAU.py b/TEMA9/SAU.py new file mode 100644 index 0000000..e0df355 --- /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] # Обр.связь с усилителем 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 otobraz(self): + print('y=', self.ypr[1]) \ No newline at end of file diff --git a/TEMA9/employee_module.py b/TEMA9/employee_module.py new file mode 100644 index 0000000..d252733 --- /dev/null +++ b/TEMA9/employee_module.py @@ -0,0 +1,30 @@ +class Employee: + def __init__(self, fio, otdel, dolzhnost, oklad): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self._pooshrenia = [] + + def salary_raise(self, summa): + if summa > 0: + self.oklad += summa + print(f"Оклад сотрудника {self.fio} увеличен на {summa}. Новый оклад: {self.oklad}") + else: + print("Сумма для повышения оклада должна быть больше нуля.") + + def change_department(self, new_department): + print(f"Сотрудник {self.fio} переведен из отдела {self.otdel} в отдел {new_department}.") + self.otdel = new_department + + def change_position(self, new_position): + print(f"Должность сотрудника {self.fio} изменена с {self.dolzhnost} на {new_position}.") + self.dolzhnost = new_position + + @property + def pooshrenia(self): + return self._pooshrenia + + def add_encouragement(self, tekst): + self._pooshrenia.append(tekst) + print(f"Сотрудник {self.fio} теперь имеет поощрение: {tekst}") \ No newline at end of file diff --git a/TEMA9/main.py b/TEMA9/main.py new file mode 100644 index 0000000..a7af88b --- /dev/null +++ b/TEMA9/main.py @@ -0,0 +1,25 @@ +from employee_module import Employee + +emp1 = Employee("Сидорова Е.Ю.", "Кафедра Управления и информационных технологий", "Старший преподаватель", 75000) +emp2 = Employee("Бауэр В.Ю.", "Дир. ИВТИ", "Заместитель директора института", 150000) + +print("=== НАЧАЛЬНЫЕ ДАННЫЕ ===") +print(f"{emp1.fio}, {emp1.otdel}, {emp1.dolzhnost}, оклад: {emp1.oklad}") +print(f"{emp2.fio}, {emp2.otdel}, {emp2.dolzhnost}, оклад: {emp2.oklad}") + +print("\n=== ОПЕРАЦИИ С СОТРУДНИКАМИ ===") +# Операции с сотрудниками +emp1.salary_raise(15000) +emp2.change_department("Дир. ЭНМИ") +emp1.change_position("Заместитель заведующего кафедрой") +emp2.add_encouragement("За преданность делу") +emp1.add_encouragement("За смелость") + +print("\n=== ИТОГОВЫЕ ДАННЫЕ ===") +# Вывод итоговых данных +print(f"{emp1.fio}, {emp1.otdel}, {emp1.dolzhnost}, оклад: {emp1.oklad}") +print(f"{emp2.fio}, {emp2.otdel}, {emp2.dolzhnost}, оклад: {emp2.oklad}") + +print("\n=== ПЕРЕЧЕНЬ ПООЩРЕНИЙ ===") +print(f"Поощрения {emp1.fio}: {emp1.pooshrenia}") +print(f"Поощрения {emp2.fio}: {emp2.pooshrenia}") \ No newline at end of file diff --git a/TEMA9/report.md b/TEMA9/report.md new file mode 100644 index 0000000..12e7bcf --- /dev/null +++ b/TEMA9/report.md @@ -0,0 +1,230 @@ +# Отчет по теме 9 + +Коваленко Дмитрий А-01-23 + + +## 9. Создание пользовательских классов и объектов + + +### 9.1 Импорт библиотек и настройка текущего каталога +```py +import os +os.chdir("/Users/vatarishin/lab_sem_5/python-labs/TEMA9") +os.getcwd() +'/Users/vatarishin/lab_sem_5/python-labs/TEMA9' +``` + +### 9.2 Создание автономного класса +```py +class Class1: + def zad_zn(self, znach): + self.data = znach + def otobrazh(self): + print(self.data) + +>>> z1 = Class1() +>>> z2 = Class1() +>>> z1.zad_zn('экз.класса 1') +>>> z2.zad_zn(-632.453) +>>> z1.otobrazh() +экз.класса 1 +>>> z2.otobrazh() +-632.453 +>>> z1.data = 'Новое значение атрибута у экз. 1' +>>> z1.otobrazh() +Новое значение атрибута у экз. 1 +``` + +### 9.3. Создание класса-наследника +```py +class Class2(Class1): + def otobrazh(self): + print('значение =', self.data) +>>> z3 = Class2() +>>> 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'] +>>> z3.zad_zn('Совсем новое') +>>> z3.otobrazh() +значение = Совсем новое +>>> z1.otobrazh() +Новое значение атрибута у экз. 1 +>>> del z1, z2, z3 +``` +### 9.4 Использование классов, содержащихся в модулях +```py +>>> from Mod3 import Class1 +>>> z4 = Class1() +>>> z4.otobrazh() +Traceback (most recent call last): + File "", line 1, in + File "/Users/vatarishin/lab_sem_5/python-labs/TEMA9/Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' +>>> z4=Class1() +>>> z4.data='значение данного data у экз.4' +>>> z4.otobrazh() +значение данного data у экз.4 +del z4 +>>> import Mod3 +>>> z4 = Mod3.Class2() +>>> z4.zad_zn('Класс из модуля') +>>> z4.otobrazh() +значение = Класс из модуля +>>> Mod3.otobrazh('Объект') +значение объекта = Объект +``` +### 9.5. Использование специальных методов +```py +class Class3(Class2): + def __init__(self,znach): + self.data=znach + def __add__(self,drug_zn): + return Class3(self.data + drug_zn) + def zad_dr_zn(self,povtor): + self.data *= povtor + +>>> z5 = Class3('abc') +>>> z5.otobrazh() +значение = abc +>>> z6 = z5 + 'def' +>>> z6.otobrazh() +значение = abcdef +>>> z6.zad_dr_zn(3) +>>> z6.otobrazh() +значение = abcdefabcdefabcdef +``` + +### 9.6. Присоединение атрибутов к классу +```py +>>> dir(Class3) +['__add__', '__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_dr_zn', 'zad_zn'] + +>>> Class3.fio='Иванов И.И.' +>>> dir(Class3) +['__add__', '__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__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] + +>>> z7 = Class3(123) +>>> dir(z7) +['__add__', '__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__', 'data', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] + +>>> dir(z7)==dir(Class3) +False + +>>> z7.rozden='1987' +>>> dir(z7) +['__add__', '__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__', 'data', 'fio', 'otobrazh', 'rozden', 'zad_dr_zn', 'zad_zn'] + +>>> dir(Class3) +['__add__', '__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__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +``` +### 9.7 Выявление родительских классов +```py +>>> Class3.__bases__ +(,) +>>> Class2.__bases__ +(,) +>>> Class1.__bases__ +(,) + +>>> object.__bases__ +() + +>>> Class3.__mro__ +(, , , ) +>>> ZeroDivisionError.__mro__ +(, , , , ) +``` +### 9.8. Создание свойства класса. +```py +class Class4: + def __init__(sam,znach): + sam.__prm=znach + def chten(sam): + return sam.__prm + def zapis(sam,znch): + sam.__prm=znch + def stiran(sam): + del sam.__prm + svojstvo=property(chten,zapis,stiran) + +>>> exempl=Class4(12) +>>> exempl.svojstvo +12 +>>> exempl.svojstvo=45 +>>> print(exempl.svojstvo) +45 +>>> del exempl.svojstvo +>>> exempl.svojstvo +>>> exempl.svojstvo +Traceback (most recent call last): + File "", line 1, in + File "", line 5, in chten +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` + +### 9.9 +```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 otobraz(self): + print('y=', self.ypr[1]) +``` +=== testSAU.py === +```py +###main_SAU +prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь +from SAU import * +xx=[0]+[1]*20 #Входной сигнал – «ступенька» +SAUe=SAU(prm) # Создаём экземпляр класса +yt=[] +for xt in xx: # Прохождение входного сигнала + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobraz() + yt.append(SAUe.ypr[1]) +import pylab +pylab.plot(yt) +pylab.show() +``` +Вывод: +``` +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 +``` +График сохранен в файле ![Figure_1](Figure_1.png). \ No newline at end of file diff --git a/TEMA9/task.md b/TEMA9/task.md new file mode 100644 index 0000000..60a1166 --- /dev/null +++ b/TEMA9/task.md @@ -0,0 +1,98 @@ +# ОБЩЕЕ КОНТРОЛЬНОЕ ЗАДАНИЕ по Теме 9 +Выполнил: Коваленко Д.М. Проверил: Козлюк Д.А. + +## Задание +Создайте и запишите в модуль класс, содержащий следующие компоненты: +- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; +- метод для обеспечения операции повышения оклада сотрудника на заданное значение; +- метод для обеспечения перевода сотрудника из одного отдела в другой; +- метод для изменения должности сотрудника; +- свойство, содержащее перечень (список) поощрений сотрудника. +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, измене-ния должности и оклада, объявления благодарности. + + +## Решение +employee_module.py +```py +class Employee: + def __init__(self, fio, otdel, dolzhnost, oklad): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self._pooshrenia = [] + + def salary_raise(self, summa): + if summa > 0: + self.oklad += summa + print(f"Оклад сотрудника {self.fio} увеличен на {summa}. Новый оклад: {self.oklad}") + else: + print("Сумма для повышения оклада должна быть больше нуля.") + + def change_department(self, new_department): + print(f"Сотрудник {self.fio} переведен из отдела {self.otdel} в отдел {new_department}.") + self.otdel = new_department + + def change_position(self, new_position): + print(f"Должность сотрудника {self.fio} изменена с {self.dolzhnost} на {new_position}.") + self.dolzhnost = new_position + + @property + def pooshrenia(self): + return self._pooshrenia + + def add_encouragement(self, tekst): + self._pooshrenia.append(tekst) + print(f"Сотрудник {self.fio} теперь имеет поощрение: {tekst}") +``` + +main.py +```py +from employee_module import Employee + +emp1 = Employee("Сидорова Е.Ю.", "Кафедра Управления и информационных технологий", "Старший преподаватель", 75000) +emp2 = Employee("Бауэр В.Ю.", "Дир. ИВТИ", "Заместитель директора института", 150000) + +print("=== НАЧАЛЬНЫЕ ДАННЫЕ ===") +print(f"{emp1.fio}, {emp1.otdel}, {emp1.dolzhnost}, оклад: {emp1.oklad}") +print(f"{emp2.fio}, {emp2.otdel}, {emp2.dolzhnost}, оклад: {emp2.oklad}") + +print("\n=== ОПЕРАЦИИ С СОТРУДНИКАМИ ===") +# Операции с сотрудниками +emp1.salary_raise(15000) +emp2.change_department("Дир. ЭНМИ") +emp1.change_position("Заместитель заведующего кафедрой") +emp2.add_encouragement("За преданность делу") +emp1.add_encouragement("За смелость") + +print("\n=== ИТОГОВЫЕ ДАННЫЕ ===") +# Вывод итоговых данных +print(f"{emp1.fio}, {emp1.otdel}, {emp1.dolzhnost}, оклад: {emp1.oklad}") +print(f"{emp2.fio}, {emp2.otdel}, {emp2.dolzhnost}, оклад: {emp2.oklad}") + +print("\n=== ПЕРЕЧЕНЬ ПООЩРЕНИЙ ===") +print(f"Поощрения {emp1.fio}: {emp1.pooshrenia}") +print(f"Поощрения {emp2.fio}: {emp2.pooshrenia}") +``` + +Вывод: +``` +=== НАЧАЛЬНЫЕ ДАННЫЕ === +Сидорова Е.Ю., Кафедра Управления и информационных технологий, Старший преподаватель, оклад: 75000 +Бауэр В.Ю., Дир. ИВТИ, Заместитель директора института, оклад: 150000 + +=== ОПЕРАЦИИ С СОТРУДНИКАМИ === +Оклад сотрудника Сидорова Е.Ю. увеличен на 15000. Новый оклад: 90000 +Сотрудник Бауэр В.Ю. переведен из отдела Дир. ИВТИ в отдел Дир. ЭНМИ. +Должность сотрудника Сидорова Е.Ю. изменена с Старший преподаватель на Заместитель заведующего кафедрой. +Сотрудник Бауэр В.Ю. теперь имеет поощрение: За преданность делу +Сотрудник Сидорова Е.Ю. теперь имеет поощрение: За смелость + +=== ИТОГОВЫЕ ДАННЫЕ === +Сидорова Е.Ю., Кафедра Управления и информационных технологий, Заместитель заведующего кафедрой, оклад: 90000 +Бауэр В.Ю., Дир. ЭНМИ, Заместитель директора института, оклад: 150000 + +=== ПЕРЕЧЕНЬ ПООЩРЕНИЙ === +Поощрения Сидорова Е.Ю.: ['За смелость'] +Поощрения Бауэр В.Ю.: ['За преданность делу'] +``` \ No newline at end of file diff --git a/TEMA9/test_SAU.py b/TEMA9/test_SAU.py new file mode 100644 index 0000000..eae324c --- /dev/null +++ b/TEMA9/test_SAU.py @@ -0,0 +1,14 @@ +###main_SAU +prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь +from SAU import * +xx=[0]+[1]*20 #Входной сигнал – «ступенька» +SAUe=SAU(prm) # Создаём экземпляр класса +yt=[] +for xt in xx: # Прохождение входного сигнала + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobraz() + yt.append(SAUe.ypr[1]) +import pylab +pylab.plot(yt) +pylab.show() \ No newline at end of file