main
PodolskyNK 2 месяцев назад
Родитель a7e0192370
Сommit b007370829

@ -1,2 +1,2 @@
perm1=input('Mod1:Введите значение = ')
print('Mod1:Значение perm1=',perm1)
perm1 = input('Mod1: Введите значение = ')
print('Mod1: Значение perm1 = ', perm1)

@ -6,6 +6,5 @@ def alpha():
def beta(q):
print('****BETA****')
import math
expi=q*math.pi
expi=q\*math.pi
return math.exp(expi)

@ -0,0 +1,439 @@
# Отчет по теме 8
Подольский Никита, А-01-23
## Пункт 1. Импорт библиотек
```py
>>> import os
>>> os.getcwd()
'/Users/nickpod/Documents/python-labs/TEMA8'
>>> import sys, importlib
```
## Пункт 2. Создание и использование модулей в среде Python.
## Пункт 2.1. Запуск модуля на выполнение путем его импорта.
Файл mod1.py содержит команды:
```py
perm1 = input('Mod1: Введите значение = ')
print('Mod1: Значение perm1 = ', perm1)
```
Файл mod2.py содержит команды:
```py
def alpha():
print('****ALPHA****')
t=input('Значение t=')
return t
def beta(q):
print('****BETA****')
import math
expi=q\*math.pi
return math.exp(expi)
```
Вызов файла как импортируемого модуля:
```py
>>> import mod1
Mod1: Введите значение = 5
Mod1: Значение perm1 = 5
>>> mod1.perm1
'5'
>>> import mod1
>>> import mod1
>>> importlib.reload(mod1)
Mod1: Введите значение = 6
Mod1: Значение perm1 = 6
<module 'mod1' from '/Users/nickpod/Documents/python-labs/TEMA8/mod1.py'>
>>> mod1.perm1
'6'
```
## Пункт 2.2. Словарь импортированных модулей
```py
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> sys.modules.pop('mod1')
<module 'mod1' from '/Users/nickpod/Documents/python-labs/TEMA8/mod1.py'>
>>> import mod1
Mod1: Введите значение = 9
Mod1: Значение perm1 = 9
>>> mod1.perm1
'9'
```
Пояснение: принципиальное отличие importlib.reload() от sys.modules.pop() заключается
в следующем: importlib.reload() перезагружает модуль, выполняя его код заново, но не удаляет модуль из кэша. Он
имеет тот же адрес в памяти и все зависимости от него остаются в силе. sys.modules.pop() убирает модуль из кэша,
при повторном импорте он уже будет иметь другой адрес, а старые зависимости ссылаются на пустой объект.
## Пункт 2.3. Запуск модуля на выполнение с помощью функции exec().
```py
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 7
Mod1: Значение perm1 = 7
>>> mod1.perm1
'9'
>>> perm1
'7'
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 88
Mod1: Значение perm1 = 88
>>> perm1
'88'
>>> exec(open('mod1.py', encoding='utf-8').read())
Mod1: Введите значение = 43
Mod1: Значение perm1 = 43
>>> perm1
'43'
```
## Пункт 2.4. Использование инструкции from … import …
```py
>>> sys.modules.pop('mod1')
<module 'mod1' from '/Users/nickpod/Documents/python-labs/TEMA8/mod1.py'>
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> from mod1 import perm1
Mod1: Введите значение = 90
Mod1: Значение perm1 = 90
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'mod1', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> perm1
'90'
```
Как видно, объект mod1 всё же появился в sys.modules.keys(). Аналогично обычному import, при первом импорте команда
инициализирует ввод, но при последующих ничего не делает.
```py
>>> from mod2 import beta
>>> g = beta(2)
>>> g
****BETA****
535.4916555247646
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'math', 'mod1', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> h = alpha(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'alpha' is not defined
>>> from mod2 import alpha as al
>>> al()
****ALPHA****
Значение t=90
>>> alpha()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'alpha' is not defined
>>> del al, beta
>>> from mod2 import alpha as al, beta as bt
>>> sys.modules.pop('mod2')
<module 'mod2' from '/Users/nickpod/Documents/python-labs/TEMA8/mod2.py'>
>>> sys.modules.pop('mod1')
<module 'mod1' from '/Users/nickpod/Documents/python-labs/TEMA8/mod1.py'>
>>> from mod2 import *
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'math', 'mod2', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> tt = alpha()
****ALPHA****
Значение t=0.12
>>> uu = beta(float(tt))
>>> uu
****BETA****
1.4578913609506803
```
## Пункт 3. Создание многомодульных программ.
## Пункт 3.1. Пример простой многомодульной программы.
Создадим файл mod0.py:
```py
import Mod1
print('perm1=',Mod1.perm1)
from Mod2 import alpha as al
tt=al()
print('tt=',tt)
from Mod2 import beta
qq=beta(float(tt))
print('qq=',qq)
```
Вызовем его в терминале, предварительно убедившись, что ни один
из трех модулей не упоминается в sys.modules.keys():
```py
>>> print(sorted(sys.modules.keys()))
\['\_\_main\_\_', '\_abc', '\_ast', '\_codecs', '\_collections', '\_collections\_abc', '\_frozen\_importlib', '\_frozen\_importlib\_external', '\_functools', '\_imp', '\_io', '\_opcode', '
\_operator', '\_signal', '\_sitebuiltins', '\_sre', '\_stat', '\_thread', '\_tokenize', '\_warnings', '\_weakref', '\_weakrefset', '\_winapi', 'abc', 'ast', 'atexit', 'builtins',
'codecs', 'collections', 'collections.abc', 'contextlib', 'copyreg', 'dis', 'encodings', 'encodings.aliases', 'encodings.cp1251', 'encodings.utf\_8', 'enum', 'functools'
, 'genericpath', 'importlib', 'importlib.\_bootstrap', 'importlib.\_bootstrap\_external', 'importlib.machinery', 'inspect', 'io', 'itertools', 'keyword', 'linecache', 'mar
shal', 'math', 'nt', 'ntpath', 'opcode', 'operator', 'os', 'os.path', 're', 're.\_casefix', 're.\_compiler', 're.\_constants', 're.\_parser', 'reprlib', 'rlcompleter', 'site', 'stat', 'sys', 'time', 'token', 'tokenize', 'types', 'warnings', 'weakref', 'winreg', 'zipimport']
>>> import mod0
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=2
tt = 2
qq = 535.4916555247646
>>> mod0.tt
'2'
>>> mod0.qq
535.4916555247646
>>> mod0.perm1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'mod0' has no attribute 'perm1'
>>> mod0.mod1.perm1
'8'
```
## Пункт 3.2.
Файл mm0.py:
```py
import mm2
print('y =', mm2.vyhod)
```
Файл mm1.py:
```py
def realdvig(xtt,kk1,TT,yti1,ytin1):
yp = kk1 * xtt
yti1 = yp + yti1
ytin1 = (yti1+TT*ytin1)/(TT+1)
return [yti1, ytin1]
def tahogen(xtt,kk2,yti2):
yp = kk2 * xtt
yti2 = yp + yti2
return yti2
def nechus(xtt,gran):
if (xtt < gran) and (xtt > (-gran)):
ytt = 0
elif xtt >= gran:
ytt = xtt - gran
elif xtt <= (-gran):
ytt = xtt + gran
return ytt
```
Файл mm2.py:
```py
znach = input('k1,T,k2,Xm,A,F,N=').split(',')
k1 = float(znach[0])
T = float(znach[1])
k2 = float(znach[2])
Xm = float(znach[3])
A = float(znach[4])
F = float(znach[5])
N = int(znach[6])
import math
vhod = []
for i in range(N):
vhod.append(A*math.sin((2*i*math.pi)/F))
import mm1 as mod
yi1 = 0; yin1 = 0; yi2 = 0
vyhod=[]
for xt in vhod:
xt1 = xt - yi2
[yi1,yin1] = mod.realdvig(xt1,k1,T,yi1,yin1)
yi2 = mod.tahogen(yin1,k2,yi2)
yt = mod.nechus(yin1,Xm)
vyhod.append(yt)
```
Тестирование:
```py
k1,T,k2,Xm,A,F,N= 5,7,12,0.5,1,7,10
y = [0, 0, -1.6392963604380273, 7.712320198368783, -31.71370650817329, 123.69447513123887, -478.0052891423595, 1843.3538071543967, -7102.275502531218, 27360.667286801297]
```
## Пункт 3.3. Области действия объектов в модулях
```py
#пример 1
def alpha():
print('****ALPHA****')
t=input('Значение t=')
beta(int(t))
return t
def beta(q):
import math
expi=q*math.pi
return math.exp(expi)
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=5
tt = 5
qq = 6635623.99934113
# пример 2
def alpha():
print('****ALPHA****')
t=input('Значение t=')
return t
def beta(q):
import math
expi = int(alpha())*math.pi
return math.exp(expi)
Mod1: Введите значение = 8
Mod1: Значение perm1 = 8
perm1 = 8
****ALPHA****
Значение t=5
tt = 5
****ALPHA****
Значение t=5
qq = 6635623.99934113
# пример 3
#Модуль mod0
import mod1
print('perm1 = ', mod1.perm1)
from mod2 import alpha as al
tt = al()
print('tt = ', tt)
from mod2 import beta
qq=beta(float(tt))
print('qq = ', qq)
print(f't = {al.t}, expi = {beta.expi}')
Traceback (most recent call last):
File "/Users/nickpod/Documents/python-labs/TEMA8/mod0.py", line 10, in <module>
print(f't = {al.t}, expi = {beta.expi}')
^^^^
AttributeError: 'function' object has no attribute 't'
Traceback (most recent call last):
File "/Users/nickpod/Documents/python-labs/TEMA8/mod0.py", line 10, in <module>
print(f't = {al}, expi = {beta.expi}')
^^^^^^^^^
AttributeError: 'function' object has no attribute 'expi'
```
Не получится вызвать эти переменные по их непосредственному имени (t и expi),
упоминая объекты, атрибутами которых они являются, без изменения кода (например,
объявления t в alpha как глобальную переменную. Но, так как мы знаем, что alpha возвращает t, то узнать t можем по имени al.
С expi и beta так не получится:
```py
# пример 4
#Модуль Mod0
import Mod1
print("perm1 =", Mod1.perm1)
from Mod2 import alpha as al
tt = al()
print("tt =", tt)
from Mod2 import beta
qq = beta(float(tt))
print("qq =", qq)
Mod1.perm1 *= 3
print("perm1 * 3 =", Mod1.perm1)
Mod1: Введите значение = 1
Mod1: Значение perm1 = 1
perm1 = 1
****ALPHA****
Значение t = 2
tt = 2
****BETA****
qq = 535.4916555247646
perm1 * 3 = 111
# пример 5
>>> mod0.mod1.perm1 \* 2
'99'
>>> mod0.tt * 2
'77'
>>> mod0.qq * 2
7106642561.694082
>>> int(mod0.mod1.perm1)\*2
18
>>> int(qq)*2
Traceback (most recent call last):
File "<pyshell#123>", line 1, in <module>
qq *= 2
NameError: name 'qq' is not defined
```
perm1 и tt, как упоминалось ранее, имеют строковый тип, так что умножение
дублирует содержимое строки. Чтобы именно увеличить значение надо использовать int. Без использования указания на модуль не получится увеличить

@ -0,0 +1,85 @@
# Общее контрольное задание по теме 8
Подольский Никита, А-01-23
## Задание
Разработайте программу, состоящую из трех модулей:
- Модуль 1 содержит функцию считывания числового списка из текстового файла с заданным именем (аргумент функции – имя файла). Элементы в файле могут располагаться по несколько на строке с разделением пробелом. Числа элементов в строках могут быть разными. Полученный список должен возвращаться в вызывающую программу.
- Модуль 2 содержит функцию расчета коэффициента корреляции по двум числовым спискам (аргументы функции – имена двух списков). Числа элементов в списках могут различаться. Значение коэффициента должно возвращаться в вызывающую программу.
- Модуль 3 запрашивает у пользователя и вводит имена двух файлов с исходными данными, дважды вызывает функцию из модуля 1 и считывает два списка из двух текстовых файлов. Затем вызывает функцию расчета коэффициента корреляции с помощью функции из модуля 2 и отображает рассчитанное значение на экране с округлением до трех цифр после точки.
Подготовьте два текстовых файла с числовыми данными и проверьте по ним работу программы.
## Решение
```py
#okz1.py
def reading (file):
  nums = []
  with open(file, 'r') as file:
  for line in file:
  nums.extend(map(float, line.split()))
  return nums
#okz2.py
import math
def correlation(a1, a2):
  n = min(len(a1), len(a2))
  sum1 = sum(a1)
  sum2 = sum(a2)
  sum1sq = sum(now ** 2 for now in a1)
  sum2sq = sum(now ** 2 for now in a2)
  sum12 = sum(x * y for x, y in zip(a1, a2))
  part1 = n * sum12 - sum1 * sum2
  part2 = math.sqrt((n * sum1sq - sum1 ** 2) * (n * sum2sq - sum2 ** 2))
  try:
  corr = part1 / part2
  return corr
  except ZeroDivisionError:
  print("Ошибка деления на ноль!")
  return
#okz3.py
from okz1 import reading
from okz2 import correlation
file1 = input("Введите имя первого файла: ")
file2 = input("Введите имя второго файла: ")
arr1 = reading(file1)
arr2 = reading(file2)
if arr1 is None or arr2 is None:
  print("Не удалось считать данные из файлов.")
else:
  corr = correlation(arr1, arr2)
  if corr is not None:
  print(f"Коэффициент корреляции: {corr:.2f}")
#Проверка
data1.txt
1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
data2.txt
10.0 9.0 9.5 8.0 7.0 5.0 4.0 2.0 1.0 7.5
Введите имя первого файла: data1.txt
Введите имя второго файла: data2.txt
Коэффициент корреляции: -0.76
Process finished with exit code 0
```

Двоичные данные
TEMA9/Figure_1.png

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

@ -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 otobraz(self):
print('y=', self.ypr[1])

@ -0,0 +1,22 @@
###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()

@ -0,0 +1,336 @@
# Отчет по теме 9
Подольский Никита, А-01-23
## 2. Создание классов и их наследников
## 2.1. Создание автономного класса
```py
>>> class Class1:
def zad_zn(self, znach):
self.data = znach
def otobrazh(self):
print(self.data)
```
Класс — это шаблон для создания объектов (экземпляров). Он определяет свойства (данные) и методы
(функции), которые будут доступны у созданных объектов.
self — это обязательный первый параметр всех методов в классе ссылающийся на конкретный
экземпляр класса и нужный для определения обращения к атрибутам и методам.
```py
>>> 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
>>> z1
<__main__.Class1 object at 0x000001D1B6566090>
```
## 2.2. Создание класса-наследника
```py
>>> class Class2(Class1):
def otobrazh(self):
print('значение =', self.data)
>>> z3 = Class2()
>>> z3
<__main__.Class2 object at 0x000001D1B66F9370>
>>> 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']
```
Объекты с нижними подчеркиваниями - встроенные атрибуты и методы, которые есть у каждого класса.
Кроме этого, есть унаследованные от родительского класса методы, один из которых переопределен.
Этот пример хорошо иллюстрирует сразу две парадигмы ООП: наследование и полиморфизм. При создании
дочернего класса атрибуты и методы родительского класса переносятся дочернему. В дочернем классе
методы могут быть переопределены. То есть метод с одинаковым именем в разных классах будет вести
себя по-разному. Это - пример полиморфизма.
```py
>>> z3.zad_zn('Совсем новое')
>>> z3.otobrazh()
значение = Совсем новое
>>> z1.otobrazh()
Новое значение атрибута у экз. 1
>>> del z1, z2, z3
```
## 3. Использование классов, содержащихся в модулях
```py
>>> from mod3 import Class1
>>> z4 = Class1()
>>> z4.otobrazh()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/nickpod/Documents/python-labs/TEMA9/mod3.py", line 5, in otobrazh
print(self.data)
^^^^^^^^^
AttributeError: 'Class1' object has no attribute 'data'
>>> del z4
>>> import mod3
>>> z4 = mod3.Class2()
>>> z4.zad_zn('Класс из модуля')
>>> z4.otobrazh()
значение = Класс из модуля
#Здесь otobrazh - это метод класса Class2 и соответствующего ему экземпляра класса z2. Этот метод непринимает значимых параметров, кроме формального self.
>>> mod3.otobrazh('Объект')
значение объекта = Объект
#Здесь otobrazh - это уже просто функция, глобально определенная в модуле mod3. Она определена вне пользовательского класса, поэтому атрибута data в ее зоне доступа нет. Так что эта функция принимает один обязательный параметр - выводимую переменную.
```
## 4. Использование специальных методов
```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
>>> from mod3 import Class3
>>> z5 = Class3('abc')
>>> z5.otobrazh()
значение = abc
>>> z6 = z5 + 'def'
>>> z6.otobrazh()
значение = abcdef
>>> z6.zad_dr_zn(3)
>>> z6.otobrazh()
значение = abcdefabcdefabcdef
```
## 5. Присоединение атрибутов к классу
```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\_dr\_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)
\['\_\_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\_dr\_zn', 'zad\_zn']
>>> dir(z7)==dir(Class3)
False
>>> 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']
```
## 6. Выявление родительских классов
```py
>>> Class3.__bases__
(<class 'mod3.Class2'>,)
>>> Class2.__bases__
(<class 'mod3.Class1'>,)
>>> Class1.__bases__
(<class 'object'>,)
>>> object.__bases__
()
#Полный порядок наследования (Method Resolution Order)
>>> Class3.__mro__
(<class 'mod3.Class3'>, <class 'mod3.Class2'>, <class 'mod3.Class1'>, <class 'object'>)
>>> ZeroDivisionError.__mro__
(<class 'ZeroDivisionError'>, <class 'ArithmeticError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
>>> IndexError.__mro__
(<class 'IndexError'>, <class 'LookupError'>, <class 'Exception'>, <class 'BaseException'>, <class 'object'>)
```
## 7. Создание свойства класса.
```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)
>>> importlib.reload(mod3)
<module 'mod3' from '/Users/nickpod/Documents/python-labs/TEMA9/mod3.py'>
>>> from mod3 import Class4
>>> exempl=Class4(12)
>>> exempl.svojstvo
12
>>> exempl.svojstvo=45
>>> print(exempl.svojstvo)
45
>>> del exempl.svojstvo
>>> exempl.svojstvo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/nickpod/Documents/python-labs/TEMA9/mod3.py", line 25, in chten
return sam.__prm
^^^^^^^^^
AttributeError: 'Class4' object has no attribute '_Class4__prm'
```
## 8. Рассмотрите пример представления в виде класса модели системы автоматического регулиро-вания (САР), состоящей
из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем.
```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 otobraz(self):
        print('y=',self.ypr[1])
#mainSau.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
```
![](figure1.png)
Загрузка…
Отмена
Сохранить