Изменил(а) на 'TEMA9/report.md'

main
EfremovSI 4 недель назад
Родитель fff9f0a567
Сommit fc15da3be1

@ -38,7 +38,8 @@ class Class2(Class1): #Class2 - наследник класса Class1
def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя
print('значение=',self.data) #Отображение данных экземпляра print('значение=',self.data) #Отображение данных экземпляра
``` ```
### Метод класса имеет то же имя, что и второй метод у родительского класса
Метод класса имеет то же имя, что и второй метод у родительского класса
### Создам экземпляр второго класса ### Создам экземпляр второго класса
```py ```py
@ -59,14 +60,15 @@ z3.otobrazh()
значение= Совсем новое значение= Совсем новое
``` ```
#### cработал метод класса Class2, метод дочернего класса "перекрывает" родительский метод Cработал метод класса Class2, метод дочернего класса "перекрывает" родительский метод
### Для проверки отображу значение данного data у первого экземпляра первого класса ### Для проверки отображу значение данного data у первого экземпляра первого класса
```py ```py
z1.otobrazh() z1.otobrazh()
Новое значение атрибута у экз.1 Новое значение атрибута у экз.1
``` ```
#### Значение не изменилось. Это подтвержает, что каждый экземпляр класса имеет свои собственные атрибуты, изменение атрибута data у экземпляра z3 (класса Class2) никак не влияет на атрибут data у экземпляра z1 (класса Class1), экземпляры классов являются независимыми объектами в памяти
Значение не изменилось. Это подтвержает, что каждый экземпляр класса имеет свои собственные атрибуты, изменение атрибута data у экземпляра z3 (класса Class2) никак не влияет на атрибут data у экземпляра z1 (класса Class1), экземпляры классов являются независимыми объектами в памяти
### Удалю экземпляры классов инструкцией ### Удалю экземпляры классов инструкцией
```py ```py
@ -100,7 +102,8 @@ Traceback (most recent call last):
print(self.data)#Отображение данных экземпляра print(self.data)#Отображение данных экземпляра
AttributeError: 'Class1' object has no attribute 'data' AttributeError: 'Class1' object has no attribute 'data'
``` ```
#### Ошибка возникла потому, что у экземпляра z4 не был определен атрибут data. При запуске происходит следующее: создается экземпляр z4 класса Class1; вызывается метод otobrazh(), который пытается выполнить print(self.data); но атрибут data еще не был создан, так как метод zad_zn() никогда не вызывался
Ошибка возникла потому, что у экземпляра z4 не был определен атрибут data. При запуске происходит следующее: создается экземпляр z4 класса Class1; вызывается метод otobrazh(), который пытается выполнить print(self.data); но атрибут data еще не был создан, так как метод zad_zn() никогда не вызывался
```py ```py
from Mod3 import Class1 from Mod3 import Class1
@ -125,11 +128,12 @@ z4.otobrazh()
Mod3.otobrazh('Объект') Mod3.otobrazh('Объект')
значение объекта= Объект значение объекта= Объект
``` ```
#### метод класса работает с атрибутами экземпляра (self.data), самостоятельная функция работает с переданным ей аргументом (objekt), класс Class2 переопределил метод otobrazh, добавив префикс "значение=", разные способы импорта (from Mod3 import Class1 vs import Mod3) влияют на пространство имен
Метод класса работает с атрибутами экземпляра (self.data), самостоятельная функция работает с переданным ей аргументом (objekt), класс Class2 переопределил метод otobrazh, добавив префикс "значение=", разные способы импорта (from Mod3 import Class1 vs import Mod3) влияют на пространство имен
# 4. Использование специальных методов # 4. Использование специальных методов
#### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ #### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ (нужны для реализации определенного поведения объектов в Python)
#### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным
### Cоздам класс, содержащий два специальных метода ### Cоздам класс, содержащий два специальных метода
```py ```py
@ -141,34 +145,41 @@ class Class3(Class2): #Наследник класса Class2, а через н
def zad_dr_zn(self,povtor): #обычный метод def zad_dr_zn(self,povtor): #обычный метод
self.data*=povtor self.data*=povtor
``` ```
### Для иллюстрации работы этих методов создам экземпляр класса Class3 и отображу его ### Для иллюстрации работы этих методов создам экземпляр класса Class3 и отображу его
```py ```py
z5=Class3('abc') #При создании экземпляра срабатывает конструктор z5=Class3('abc') #При создании экземпляра срабатывает конструктор
z5.otobrazh() z5.otobrazh()
значение= abc значение= abc
``` ```
### Теперь выполню операцию «+» (должен сработать специальный метод __add__) ### Теперь выполню операцию «+» (должен сработать специальный метод __add__)
```py ```py
z6=z5+'def' z6=z5+'def'
z6.otobrazh() z6.otobrazh()
значение= abcdef значение= abcdef
``` ```
### Обращусь к обычному методу класса ### Обращусь к обычному методу класса
```py ```py
z6.zad_dr_zn(3) z6.zad_dr_zn(3)
z6.otobrazh() z6.otobrazh()
значение= abcdefabcdefabcdef значение= abcdefabcdefabcdef
``` ```
# 5. Присоединение атрибутов к классу # 5. Присоединение атрибутов к классу
### Выведу список атрибутов класса Class3 ### Выведу список атрибутов класса Class3
```py ```py
dir(Class3) 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'] ['__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']
``` ```
### Создам новый атрибут класса простым присваиванием ### Создам новый атрибут класса простым присваиванием
```py ```py
Class3.fio='Иванов И.И.' Class3.fio='Иванов И.И.'
``` ```
### Вновь выведу список атрибутов и увижу, что у класса появился новый атрибут fio ### Вновь выведу список атрибутов и увижу, что у класса появился новый атрибут fio
```py ```py
dir(Class3) dir(Class3)
@ -178,6 +189,7 @@ dir(Class3)
```py ```py
z7=Class3(123) z7=Class3(123)
``` ```
### Выведу список атрибутов экземпляра. Сделаю формальную проверку, чтобы понять совпадает ли он с атрибутами класса ### Выведу список атрибутов экземпляра. Сделаю формальную проверку, чтобы понять совпадает ли он с атрибутами класса
```py ```py
dir(z7) dir(z7)
@ -185,7 +197,8 @@ dir(z7)
dir(z7)==dir(Class3) dir(z7)==dir(Class3)
False False
``` ```
#### dir(Class3) показывает атрибуты класса (методы, классовые атрибуты); dir(z7) показывает атрибуты экземпляра (данные экземпляра + атрибуты класса); у экземпляра появляется атрибут data
dir(Class3) показывает атрибуты класса (методы, классовые атрибуты); dir(z7) показывает атрибуты экземпляра (данные экземпляра + атрибуты класса); у экземпляра появляется атрибут data
### Объявлю новый атрибут у созданного экземпляра. После выведу список атрибутов экземпляра z7 и увижу, что в нем появился атрибут rozden ### Объявлю новый атрибут у созданного экземпляра. После выведу список атрибутов экземпляра z7 и увижу, что в нем появился атрибут rozden
@ -199,7 +212,8 @@ dir(z7)
dir(Class3) 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'] ['__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']
``` ```
#### Этот атрибут не появился. Атрибут rozden был добавлен только к экземпляру z7, но не к классу Class3. Изменения на уровне экземпляра не влияют на класс
Этот атрибут не появился. Атрибут rozden был добавлен только к экземпляру z7, но не к классу Class3. Изменения на уровне экземпляра не влияют на класс
# 6. Выявление родительских классов # 6. Выявление родительских классов
### Такое выявление делается с помощью специального атрибута __bases__ ### Такое выявление делается с помощью специального атрибута __bases__
@ -261,7 +275,8 @@ Traceback (most recent call last):
return sam.__prm return sam.__prm
AttributeError: 'Class4' object has no attribute '_Class4__prm' AttributeError: 'Class4' object has no attribute '_Class4__prm'
``` ```
#### Полученный результат и объяснение: после выполнения del exempl.svojstvo происходит следующее: вызывается метод stiran, который выполняет del sam.__prm; удаляется приватный атрибут __prm у экземпляра; при последующей попытке чтения exempl.svojstvo: вызывается метод chten; метод пытается вернуть sam.__prm; но атрибут __prm уже удален; возникает ошибка AttributeError
Полученный результат и объяснение: после выполнения del exempl.svojstvo происходит следующее: вызывается метод stiran, который выполняет del sam.__prm; удаляется приватный атрибут __prm у экземпляра; при последующей попытке чтения exempl.svojstvo: вызывается метод chten; метод пытается вернуть sam.__prm; но атрибут __prm уже удален; возникает ошибка AttributeError
# 8. Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. # 8. Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем.
### Создам модуль SAU.py с классом ### Создам модуль SAU.py с классом

Загрузка…
Отмена
Сохранить