From c585f980005852ea26b98b8da187d08c9b3c1fe0 Mon Sep 17 00:00:00 2001 From: Danil Date: Fri, 19 Dec 2025 10:04:17 +0300 Subject: [PATCH] =?UTF-8?q?report:=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA9/Employee.py | 29 +++++ TEMA9/Mod3.py | 10 ++ TEMA9/Ris1.png | Bin 0 -> 17382 bytes TEMA9/SAU.py | 17 +++ TEMA9/main_SAU.py | 25 +++++ TEMA9/protocol.md | 262 +++++++++++++++++++++++++++++++++++++++++++++ TEMA9/protocol.py | 243 +++++++++++++++++++++++++++++++++++++++++ TEMA9/protocol.txt | 243 +++++++++++++++++++++++++++++++++++++++++ TEMA9/task9.md | 100 +++++++++++++++++ TEMA9/task9.py | 29 +++++ 10 files changed, 958 insertions(+) create mode 100644 TEMA9/Employee.py create mode 100644 TEMA9/Mod3.py create mode 100644 TEMA9/Ris1.png create mode 100644 TEMA9/SAU.py create mode 100644 TEMA9/main_SAU.py create mode 100644 TEMA9/protocol.md create mode 100644 TEMA9/protocol.py create mode 100644 TEMA9/protocol.txt create mode 100644 TEMA9/task9.md create mode 100644 TEMA9/task9.py 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/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..7ead188 --- /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) diff --git a/TEMA9/Ris1.png b/TEMA9/Ris1.png new file mode 100644 index 0000000000000000000000000000000000000000..7f005d68cfa51a68181f9c32952a7ad913f4138d GIT binary patch literal 17382 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 Экземпляр класса 1 +z2.otobrazh() +>> -632.453 +z1.data = "Новое значение атрибута у экземпляра 1" +z1.otobrazh() +>> Новое значение атрибута у экземпляра 1 +``` +## 2.2. Создание класса-наследника +Также классы могут наследоваться от других классов, т.е. иметь такие же поля данных как и класс-родитель и имплементировать его методы, которые можно переопределять. +Следует отметить,что метод класса имеет то же имя, что и второй метод у родительского класса + +``` +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя + 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() +>> значение= Совсем новое #Сработал переопределенный метод otobrazh класса Class2 +z1.otobrazh() +>> Новое значение атрибута у экземпляра 1 # Значение поля data класса Class1 не изменилось +del z1,z2,z3 +``` +Объекты с нижними подчеркиваниями - встроенные атрибуты и методы + +# 3 Использование классов, содержащихся в модулях + +Классы могут быть описаны в модулях, которые потом должны быть подключены к основной программе, чтобы реализовать объекты соответствующего класса. Так, например, в модуле "Mod3.py" описано обявление класса Class1 + +Создание модуля +``` +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) +``` +Импортирование класса из модуля с помощью обычной инструкции +``` +from Mod3 import Class1 +z4=Class1() +z4.otobrazh() +>> Traceback (most recent call last): + File "", line 1, in + z4.otobrazh() + File "C:\Users\Dannyan\OneDrive\Рабочий стол\python-labs\TEMA9\Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' +``` +Поле data класса не было инициализировано, поэтому его еще нет в классе +``` +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +>> значение данного data у экз.4 +import Mod3 #Полный импорт содержимого модуля +z4=Mod3.Class2() +z4.zad_zn('Класс из модуля') +z4.otobrazh() +>> значение= Класс из модуля +Mod3.otobrazh('Объект') +>> значение объекта= Объект +``` +Использован метод для отображения значения поля, описанный в Class2 + +# 4 Использование специвльных методов +Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ + +Для примера создайте класс, содержащий два специальных метода +``` +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + 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 +``` +Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов. +Для иллюстрации работы этих методов создайте экземпляр класса Class3 и отобразите его +``` +z5=Class3('abc') #При создании экземпляра срабатывает конструктор +z5.otobrazh() +>> значение= abc +``` +А теперь выполните операцию «+» (должен сработать специальный метод __add__) +``` +z6=z5+'def' +z6.otobrazh() +>> значение= abcdef +``` +Ну и наконец, обратитесь к обычному методу класса: +``` +z6.zad_dr_zn(3) +z6.otobrazh() +>> значение= abcdefabcdefabcdef +``` +# 5 Присоединение атрибутов к классу + +Каждый класс обладает определенными атрибутами, список которых можно получить с помощью ранее изученной команды dir(). +``` +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='Иванов И.И.' +z7=Class3(123) +dir(z7)==dir(Class3) +>> False +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'] +z7.fio +>> 'Иванов И.И.' +Class3.fio +>> 'Иванов И.И.' +z7.rozden = "1987" +"rozden" in dir(z7) # Проверка того, что поле rozden появилось в объекте класса +>> True +"rozden" in dir(Class3) # Проверка того, что поле rozden не появилось в самом классе +>> False +``` +# 6 Выявление родительских классов +Такое выявление делается с помощью специального атрибута __bases__, например, выведите родительский класс для созданного класса Class3: +``` +Class3.__bases__ +>> (,) +Class2.__bases__ +>> (,) +Class1.__bases__ +>> (,) +``` +Для получения всей цепочки наследования используйте атрибут __mro__: +``` +Class3.__mro__ +>> (, , , ) +ZeroDivisionError.__mro__ +>> (, , , , ) +``` +# 7 Создание свойства класса +Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута. +Создадим, например, новый класс с определенным в нем свойством +``` +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) +``` +Здесь имеется 3 метода: 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 + exempl.svojstvo + File "", line 5, in chten + return sam.__prm +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` +Отображение отсутствующего в объектке класса свойства вызывает ошибку +# 8 Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. +Создайте модуль 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 otobraz(self): + print('y=',self.ypr[1]) +``` +Также создадим и выполним программу 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 +``` +![](Ris1.png) diff --git a/TEMA9/protocol.py b/TEMA9/protocol.py new file mode 100644 index 0000000..37f37df --- /dev/null +++ b/TEMA9/protocol.py @@ -0,0 +1,243 @@ +#Тема 8 Лазарев Данил А-01-23 +#1 Запуск интерактивной оболочки IDLE +``` +import os +os.chdir("C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA9") +os.getcwd() +>> 'C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA9' +``` +#2 Создание классов и их наследников +## 2.1. Создание автономного класса +Создадим класс с именем Class1, содержащий 2 функции, реализующие его методы. +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. Создание класса-наследника +``` +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя + 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 +``` +#3 Использование классов, содержащихся в модулях +Создание модуля +``` +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) +``` +ddd +``` +from Mod3 import Class1 +z4=Class1() +z4.otobrazh() +>> Traceback (most recent call last): + File "", line 1, in + z4.otobrazh() + File "C:\Users\Dannyan\OneDrive\Рабочий стол\python-labs\TEMA9\Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +>> значение данного data у экз.4 +import Mod3 #Полный импорт содержимого модуля +z4=Mod3.Class2() +z4.zad_zn('Класс из модуля') +z4.otobrazh() +>> значение= Класс из модуля +Mod3.otobrazh('Объект') +>> значение объекта= Объект +``` +#4 Использование специвльных методов +Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ + +Для примера создайте класс, содержащий два специальных метода +``` +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + 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 +``` +Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов. +Для иллюстрации работы этих методов создайте экземпляр класса Class3 и отобразите его +``` +z5=Class3('abc') #При создании экземпляра срабатывает конструктор +z5.otobrazh() +>> значение= abc +``` +А теперь выполните операцию «+» (должен сработать специальный метод __add__) +``` +z6=z5+'def' +z6.otobrazh() +>> значение= abcdef +``` +Ну и наконец, обратитесь к обычному методу класса: +``` +z6.zad_dr_zn(3) +z6.otobrazh() +>> значение= abcdefabcdefabcdef +``` +#5 Присоединение атрибутов к классу +``` +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='Иванов И.И.' +z7=Class3(123) +dir(z7)==dir(Class3) +>> False +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'] +z7.fio +>> 'Иванов И.И.' +Class3.fio +>> 'Иванов И.И.' +z7.rozden = "1987" +"rozden" in dir(z7) +>> True +"rozden" in dir(Class3) +>> False +``` +#6 Выявление родительских классов +Такое выявление делается с помощью специального атрибута __bases__, например, выведите родительский класс для созданного класса Class3: +``` +Class3.__bases__ +>> (,) +Class2.__bases__ +>> (,) +Class1.__bases__ +>> (,) +``` +Для получения всей цепочки наследования используйте атрибут __mro__: +``` +Class3.__mro__ +>> (, , , ) +ZeroDivisionError.__mro__ +>> (, , , , ) +``` +#7 Создание свойства класса +Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута. +Создадим, например, новый класс с определенным в нем свойством +``` +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) +``` +Здесь имеется 3 метода: 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 + exempl.svojstvo + File "", line 5, in chten + return sam.__prm +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` +#8 Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. +Создайте модуль 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 otobraz(self): + print('y=',self.ypr[1]) +``` +Также создадим и выполним программу 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 +``` +![](Ris1.png) diff --git a/TEMA9/protocol.txt b/TEMA9/protocol.txt new file mode 100644 index 0000000..37f37df --- /dev/null +++ b/TEMA9/protocol.txt @@ -0,0 +1,243 @@ +#Тема 8 Лазарев Данил А-01-23 +#1 Запуск интерактивной оболочки IDLE +``` +import os +os.chdir("C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA9") +os.getcwd() +>> 'C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA9' +``` +#2 Создание классов и их наследников +## 2.1. Создание автономного класса +Создадим класс с именем Class1, содержащий 2 функции, реализующие его методы. +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. Создание класса-наследника +``` +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя + 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 +``` +#3 Использование классов, содержащихся в модулях +Создание модуля +``` +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) +``` +ddd +``` +from Mod3 import Class1 +z4=Class1() +z4.otobrazh() +>> Traceback (most recent call last): + File "", line 1, in + z4.otobrazh() + File "C:\Users\Dannyan\OneDrive\Рабочий стол\python-labs\TEMA9\Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +>> значение данного data у экз.4 +import Mod3 #Полный импорт содержимого модуля +z4=Mod3.Class2() +z4.zad_zn('Класс из модуля') +z4.otobrazh() +>> значение= Класс из модуля +Mod3.otobrazh('Объект') +>> значение объекта= Объект +``` +#4 Использование специвльных методов +Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ + +Для примера создайте класс, содержащий два специальных метода +``` +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + 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 +``` +Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов. +Для иллюстрации работы этих методов создайте экземпляр класса Class3 и отобразите его +``` +z5=Class3('abc') #При создании экземпляра срабатывает конструктор +z5.otobrazh() +>> значение= abc +``` +А теперь выполните операцию «+» (должен сработать специальный метод __add__) +``` +z6=z5+'def' +z6.otobrazh() +>> значение= abcdef +``` +Ну и наконец, обратитесь к обычному методу класса: +``` +z6.zad_dr_zn(3) +z6.otobrazh() +>> значение= abcdefabcdefabcdef +``` +#5 Присоединение атрибутов к классу +``` +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='Иванов И.И.' +z7=Class3(123) +dir(z7)==dir(Class3) +>> False +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'] +z7.fio +>> 'Иванов И.И.' +Class3.fio +>> 'Иванов И.И.' +z7.rozden = "1987" +"rozden" in dir(z7) +>> True +"rozden" in dir(Class3) +>> False +``` +#6 Выявление родительских классов +Такое выявление делается с помощью специального атрибута __bases__, например, выведите родительский класс для созданного класса Class3: +``` +Class3.__bases__ +>> (,) +Class2.__bases__ +>> (,) +Class1.__bases__ +>> (,) +``` +Для получения всей цепочки наследования используйте атрибут __mro__: +``` +Class3.__mro__ +>> (, , , ) +ZeroDivisionError.__mro__ +>> (, , , , ) +``` +#7 Создание свойства класса +Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута. +Создадим, например, новый класс с определенным в нем свойством +``` +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) +``` +Здесь имеется 3 метода: 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 + exempl.svojstvo + File "", line 5, in chten + return sam.__prm +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` +#8 Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. +Создайте модуль 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 otobraz(self): + print('y=',self.ypr[1]) +``` +Также создадим и выполним программу 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 +``` +![](Ris1.png) diff --git a/TEMA9/task9.md b/TEMA9/task9.md new file mode 100644 index 0000000..cccbec0 --- /dev/null +++ b/TEMA9/task9.md @@ -0,0 +1,100 @@ +# Общее контрольное задание по Теме 9 +Лазарев Данил, А-01-23 +## Задание +Создайте и запишите в модуль класс, содержащий следующие компоненты: + +- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; + +- метод для обеспечения операции повышения оклада сотрудника на заданное значение; + +- метод для обеспечения перевода сотрудника из одного отдела в другой; + +- метод для изменения должности сотрудника; + +- свойство, содержащее перечень (список) поощрений сотрудника. + +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности. + + +# Решение +Модуль Employee +``` +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} + """) +``` +Реализация программы +``` +import os +os.chdir("C:\\Users\\Dannyan\\OneDrive\\Рабочий стол\\python-labs\\TEMA9") +from Employee import Employee +E1 = Employee("Сидорова Е.Ю.","Кафедра управления и интеллектульных систем","Старший преподаватель",80000) +E2 = Employee("Вишняков С.В.","Дирекция ИВТИ","Директор института ИВТИ",200000) +E1.get_employee_info() + +>>> + ФИО: Сидорова Е.Ю. + Отдел: Кафедра управления и интеллектульных систем + Должность: Старший преподаватель + Оклад: 80000 руб. + Поощрения: [] + +E2.get_employee_info() + +>>> + ФИО: Вишняков С.В. + Отдел: Дирекция ИВТИ + Должность: Директор института ИВТИ + Оклад: 200000 руб. + Поощрения: [] + +E1.change_oklad(10000) +E2.change_oklad(-20000) +E2.change_otdel("Дирекция ГПИ") +E2.change_dolzhnost("Заместитель директора ГПИ") +E1.set_pooshreniya("Премирование") +E2.set_pooshreniya("Награда за заслуги перед МЭИ") +E1.get_employee_info() + +>>> + ФИО: Сидорова Е.Ю. + Отдел: Кафедра управления и интеллектульных систем + Должность: Старший преподаватель + Оклад: 90000 руб. + Поощрения: ['Премирование'] + +E2.get_employee_info() + +>>> + ФИО: Вишняков С.В. + Отдел: Дирекция ГПИ + Должность: Заместитель директора ГПИ + Оклад: 180000 руб. + Поощрения: ['Награда за заслуги перед МЭИ'] +``` \ No newline at end of file diff --git a/TEMA9/task9.py b/TEMA9/task9.py new file mode 100644 index 0000000..e3db52b --- /dev/null +++ b/TEMA9/task9.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} + """)