diff --git a/TEMA9/Employee.py b/TEMA9/Employee.py new file mode 100644 index 0000000..e3db52b --- /dev/null +++ b/TEMA9/Employee.py @@ -0,0 +1,29 @@ +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 + ) + def change_oklad(self, diff): + self.oklad += diff + def change_otdel(self, new_otdel): + self.otdel = new_otdel + def change_dolzhnost(self, new_dolzhnost): + self.dolzhnost = new_dolzhnost + def get_pooshreniya(self): + return list(self.__pooshreniya) + def set_pooshreniya(self,pooshrenie): + self.__pooshreniya.append(pooshrenie) + def get_employee_info(self): + print(f""" + ФИО: {self.fio} + Отдел: {self.otdel} + Должность: {self.dolzhnost} + Оклад: {self.oklad} руб. + Поощрения: {self.__pooshreniya} + """) diff --git a/TEMA9/Figure_1.png b/TEMA9/Figure_1.png new file mode 100644 index 0000000..425d63d Binary files /dev/null and b/TEMA9/Figure_1.png differ diff --git a/TEMA9/Figure_2.png b/TEMA9/Figure_2.png new file mode 100644 index 0000000..fec9377 Binary files /dev/null and b/TEMA9/Figure_2.png differ 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..664b46f --- /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 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..c94fac7 --- /dev/null +++ b/TEMA9/main_SAU.py @@ -0,0 +1,19 @@ +from SAU import * +prm = [5, 2, 3, 2] # Параметры модели: 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() diff --git a/TEMA9/report.md b/TEMA9/report.md new file mode 100644 index 0000000..48db77a --- /dev/null +++ b/TEMA9/report.md @@ -0,0 +1,294 @@ +# Отчет по теме 9 + +Беженарь Алёна, А-02-23 + +## Создание пользовательских классов и объектов + +### 1. Установка рабочего каталога. +В оболочке IDLE установила актуальный рабочий каталог, а затем в нём создал рабочий протокол. +```py +>>> import os +>>> os.chdir("C:\\Users\\Дружок\\Desktop\\ПОАС\\python-labs\\TEMA9") +``` +### 2. Создание классов и их наследников. +Класс в Python, как и в других языках программирования, - это элемент ПО, описывающий абстрактный тип данных и его частичную или полную реализацию. Классы – это основные инструменты объектно-ориентированного программирования (ООП) в языке Python. Они представляют собой шаблоны, образцы, по которым может быть создано множество объектов-экземпляров класса. У каждого класса есть уникальное имя и некоторый набор специфических для него атрибутов: полей и методов, которые могут использоваться при работе с экземплярами класса. + +#### 2.1. Создание автономного класса. +Классы могут быть автономными, т.е. независящими от других классов: +```py +>>> class Class1: # Объявление класса +... def zad_zn(self, znach): # Метод класса для задания значения поля data +... self.data = znach # self - ссылка на экземпляр класса Class1 +... 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\Дружок\Desktop\ПОАС\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 +>>> del z4 +``` +Теперь импортируем модуль полностью: +```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 = "Иванов И.И." +>>> 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__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +>>> 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" +>>> dir(z7) + ['__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', 'rozden', 'zad_dr_zn', 'zad_zn'] +>>> 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__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +>>> "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) +... +>>> exempl = Class4(12) +>>> exempl.svojstvo + 12 +>>> exempl.svojstvo = 45 +>>> print(exempl.svojstvo) + 45 +>>> del exempl.svojstvo +>>> exempl.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]) +``` +```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 +``` +![Скриншот построенного графика](Figure1.png) +Результат с другими параметрами системы: prm = [5, 2, 3, 2] # Параметры модели: K1, T1, T2, K2 +```py +>>> import importlib +>>> importlib.reload(main_SAU) +y = 0.0 +y = 0.4166666666666667 +y = 0.6597222222222223 +y = 0.5931712962962963 +y = 0.43282214506172834 +y = 0.3725606031378601 +y = 0.41758261263288754 +y = 0.47397622246692106 +y = 0.48436149012259344 +y = 0.462222758004719 +y = 0.44411586377478934 +y = 0.4446228748662676 +y = 0.4539720784512614 +y = 0.4591722749967687 +y = 0.45753112118915107 +y = 0.4539736831952871 +y = 0.4527190879360086 +y = 0.4537659596983615 +y = 0.45500393252270654 +y = 0.4552026474557314 +y = 0.4546995780878234 +``` +![Скриншот построенного графика](Figure2.png) +## 9. Завершение работы со средой. +Сохранила файлы отчета в своем рабочем каталоге и закончила сеанс работы с IDLE. \ No newline at end of file diff --git a/TEMA9/task.md b/TEMA9/task.md new file mode 100644 index 0000000..a5a5cde --- /dev/null +++ b/TEMA9/task.md @@ -0,0 +1,89 @@ +# Общее контрольное задание по теме 9 + +Беженарь Алёна, А-02-23 + +## Задание + +Создайте и запишите в модуль класс, содержащий следующие компоненты: +* конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; +* метод для обеспечения операции повышения оклада сотрудника на заданное значение; +* метод для обеспечения перевода сотрудника из одного отдела в другой; +* метод для изменения должности сотрудника; +* свойство, содержащее перечень (список) поощрений сотрудника. + +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности. + +## Решение +```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 + ) + def change_oklad(self, diff): + self.oklad += diff + def change_otdel(self, new_otdel): + self.otdel = new_otdel + def change_dolzhnost(self, new_dolzhnost): + self.dolzhnost = new_dolzhnost + def get_pooshreniya(self): + return list(self.__pooshreniya) + def set_pooshreniya(self,pooshrenie): + self.__pooshreniya.append(pooshrenie) + def get_employee_info(self): + print(f""" + ФИО: {self.fio} + Отдел: {self.otdel} + Должность: {self.dolzhnost} + Оклад: {self.oklad} руб. + Поощрения: {self.__pooshreniya} + """) +``` +```py +>>> from Employee import Employee +>>> employee1 = Employee("Киреев Ю.П.", "Отдел по развлечению клиентов", "Клоун", 100000) +>>> employee2 = Employee("Володин Д.В.", "Отдел инноваций", "программист БЯМов", 150000) +>>> employee1.get_employee_info() # Отображение полной информации об экземпляре класса + + ФИО: Киреев Ю.П. + Отдел: Отдел по развлечению клиентов + Должность: Клоун + Оклад: 100000 руб. + Поощрения: [] + +>>> employee2.get_employee_info() + + ФИО: Володин Д.В. + Отдел: Отдел инноваций + Должность: программист БЯМов + Оклад: 150000 руб. + Поощрения: [] + +>>> employee1.change_otdel("Отдел по работе с клиентами") # Изменение отдела +>>> employee1.change_oklad(5000) # Изменение оклада +>>> employee2.change_oklad(-5000) # Изменение оклада +>>> employee2.change_dolzhnost("БЯМовед") # Изменение должности +>>> employee1.set_pooshreniya("Почетная грамота") # Добавление поощрения +>>> employee2.set_pooshreniya("Медаль") +>>> employee1.get_employee_info() # Отображение полной информации об экземпляре класса + + ФИО: Киреев Ю.П. + Отдел: Отдел по работе с клиентами + Должность: Клоун + Оклад: 105000 руб. + Поощрения: ['Почетная грамота'] + +>>> employee2.get_employee_info() + + ФИО: Володин Д.В. + Отдел: Отдел инноваций + Должность: БЯМовед + Оклад: 145000 руб. + Поощрения: ['Медаль'] +``` \ No newline at end of file