diff --git a/TEMA8/report.md b/TEMA8/report.md index aada1a7..713d371 100644 --- a/TEMA8/report.md +++ b/TEMA8/report.md @@ -9,6 +9,7 @@ >>> import os,sys,imp >>> os.chdir('D://test') >>> os.getcwd() +'D:\\test' ``` ## 2. Создание и использование модулей в среде Python. diff --git a/TEMA9/Figure_1.png b/TEMA9/Figure_1.png new file mode 100644 index 0000000..88bb561 Binary files /dev/null and b/TEMA9/Figure_1.png differ diff --git a/TEMA9/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..bb1968b --- /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/SAU.py b/TEMA9/SAU.py new file mode 100644 index 0000000..6f0cc48 --- /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]) diff --git a/TEMA9/main_SAU.py b/TEMA9/main_SAU.py new file mode 100644 index 0000000..51afef1 --- /dev/null +++ b/TEMA9/main_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() diff --git a/TEMA9/report.md b/TEMA9/report.md new file mode 100644 index 0000000..c8d5ebf --- /dev/null +++ b/TEMA9/report.md @@ -0,0 +1,265 @@ +# Отчет по теме 9 + +## 1. Запуск интерактивной оболочки IDLE. + +## 2. Создание классов и их наследников +### 2.1. Создание автономного класса + +Создаем класс с именем Class1, содержащий 2 функции, реализующие его методы +``` +>>>class Class1: #Объявление класса + def zad_zn(self,znach): #Метод 1 класса1 – задание значения data + self.data=znach # self - ссылка на экземпляр класса + def otobrazh(self): # Метод 2 класса1 + print(self.data)#Отображение данных экземпляра класса +>>>z1=Class1() #Создаём 1-й экземпляр класса +>>>z2=Class1() #Создаём 2-й экземпляр класса +>>>z1.zad_zn('экз.класса 1') #Обращение к методу класса у 1-го экз. +>>>z2.zad_zn(-632.453) #Обращение к методу класса у 2-го экз. +>>>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() # Экземпляр второго класса +>>>z3 +<__main__.Class2 object at 0x0000020A3F1C6770> +>>>dir(z3) +['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__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() +значение= Совсем новое +``` +При вызове z3.otobrazh() сработал метод класса Class2, потому что z3 принадлежит классу Class2. +``` +>>>z1.otobrazh() +>>>Новое значение атрибута у экз.1 +``` +Как видим значение не изменилось. +Удаление экземпляров классов инструкцией: +``` +>>>del z1, z2, z3 +``` + +## 3. Использование классов, содержащихся в модулях +Создадим модуль с именем Mod3, в который запишите следующее: +``` +>>>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 "D:\test\Mod3.py", line 5, in otobrazh + print(self.data)#Отображение данных экземпляра +AttributeError: 'Class1' object has no attribute 'data' +``` +Данная ошибка возникает потому, что метод otobrazh() пытается обратиться к self.data, а Атрибут data еще не был создан для экземпляра z4. Мы не вызывали метод zad_zn(), который создает атрибут data. + +``` +>>>from Mod3 import Class1 +>>>z4 = Class1() +>>>z4.data = 'значение данного data у экз.4' +>>>z4.otobrazh() +значение данного data у экз.4 +``` + +Удаление экземпляра z4 и после этого импорт модуля целиком. +``` +>>> z4 +>>>dir(z4) +Traceback (most recent call last): + File "", line 1, in + dir(z4) +NameError: name 'z4' is not defined +>>>import Mod3 #Полный импорт содержимого модуля +>>>z4 = Mod3.Class2() +``` +Здесь otobrazh - это уже просто функция, глобально определенная в модуле mod3. Она определена вне пользовательского класса, поэтому атрибута data в ее зоне доступа нет. Так что эта функция принимает один обязательный параметр - выводимую переменную. + +## 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 +>>>z6 = z5 + 'def' +>>>z6.otobrazh() +значение= abcdef +>>>z6.zad_dr_zn(3) +>>>z6.otobrazh() +значение= abcdefabcdefabcdef +``` + +## 5. Присоединение атрибутов к классу. +``` +>>>dir(Class3) +['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +>>>Class3.fio='Иванов И.И.' +>>>dir(Class3) +['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__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'] # Появился атрибут fio +>>>dir(z7) +['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +>>>dir(z7)==dir(Class3) +False # Список атрибутов класса не совпадает со списком атрибутов экземпляра +>>>print(z7.fio) +Иванов И.И. +>>>z7.fio == Class3.fio +True # Видим совпадение значений +>>>dir(z7) +['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__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__', '__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 у класса не появился. + +## 6. Выявление родительских классов. +``` +>>> Class3.__bases__ # Вывод родительского класса +(,) +>>> Class2.__bases__ +(,) +>>> Class1.__bases__ +(,) +>>> 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) +... +... +>>> 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() +============================= RESTART: D:/test/main_SAU.py ============================= +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.png) + + +## 9. Завершение работы со средой IDLE. \ No newline at end of file