From fc15da3be123b120500f7cdc8f2d64282cf53122 Mon Sep 17 00:00:00 2001 From: EfremovSI Date: Sun, 14 Dec 2025 18:12:34 +0000 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB(?= =?UTF-8?q?=D0=B0)=20=D0=BD=D0=B0=20'TEMA9/report.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TEMA9/report.md | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/TEMA9/report.md b/TEMA9/report.md index f9ef9df..be3dc20 100644 --- a/TEMA9/report.md +++ b/TEMA9/report.md @@ -38,7 +38,8 @@ class Class2(Class1): #Class2 - наследник класса Class1 def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя print('значение=',self.data) #Отображение данных экземпляра ``` -### Метод класса имеет то же имя, что и второй метод у родительского класса + +Метод класса имеет то же имя, что и второй метод у родительского класса ### Создам экземпляр второго класса ```py @@ -59,14 +60,15 @@ z3.otobrazh() значение= Совсем новое ``` -#### cработал метод класса Class2, метод дочернего класса "перекрывает" родительский метод +Cработал метод класса Class2, метод дочернего класса "перекрывает" родительский метод ### Для проверки отображу значение данного data у первого экземпляра первого класса ```py z1.otobrazh() Новое значение атрибута у экз.1 ``` -#### Значение не изменилось. Это подтвержает, что каждый экземпляр класса имеет свои собственные атрибуты, изменение атрибута data у экземпляра z3 (класса Class2) никак не влияет на атрибут data у экземпляра z1 (класса Class1), экземпляры классов являются независимыми объектами в памяти + +Значение не изменилось. Это подтвержает, что каждый экземпляр класса имеет свои собственные атрибуты, изменение атрибута data у экземпляра z3 (класса Class2) никак не влияет на атрибут data у экземпляра z1 (класса Class1), экземпляры классов являются независимыми объектами в памяти ### Удалю экземпляры классов инструкцией ```py @@ -100,7 +102,8 @@ Traceback (most recent call last): print(self.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 from Mod3 import Class1 @@ -125,11 +128,12 @@ z4.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. Использование специальных методов -#### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ -#### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным +#### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ (нужны для реализации определенного поведения объектов в Python) + ### Cоздам класс, содержащий два специальных метода ```py @@ -141,34 +145,41 @@ class Class3(Class2): #Наследник класса Class2, а через н def zad_dr_zn(self,povtor): #обычный метод self.data*=povtor ``` + ### Для иллюстрации работы этих методов создам экземпляр класса Class3 и отображу его ```py z5=Class3('abc') #При создании экземпляра срабатывает конструктор z5.otobrazh() значение= abc ``` + ### Теперь выполню операцию «+» (должен сработать специальный метод __add__) ```py z6=z5+'def' z6.otobrazh() значение= abcdef ``` + ### Обращусь к обычному методу класса ```py z6.zad_dr_zn(3) z6.otobrazh() значение= abcdefabcdefabcdef ``` + + # 5. Присоединение атрибутов к классу ### Выведу список атрибутов класса Class3 ```py 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'] ``` + ### Создам новый атрибут класса простым присваиванием ```py Class3.fio='Иванов И.И.' ``` + ### Вновь выведу список атрибутов и увижу, что у класса появился новый атрибут fio ```py dir(Class3) @@ -178,6 +189,7 @@ dir(Class3) ```py z7=Class3(123) ``` + ### Выведу список атрибутов экземпляра. Сделаю формальную проверку, чтобы понять совпадает ли он с атрибутами класса ```py dir(z7) @@ -185,7 +197,8 @@ dir(z7) dir(z7)==dir(Class3) False ``` -#### dir(Class3) показывает атрибуты класса (методы, классовые атрибуты); dir(z7) показывает атрибуты экземпляра (данные экземпляра + атрибуты класса); у экземпляра появляется атрибут data + +dir(Class3) показывает атрибуты класса (методы, классовые атрибуты); dir(z7) показывает атрибуты экземпляра (данные экземпляра + атрибуты класса); у экземпляра появляется атрибут data ### Объявлю новый атрибут у созданного экземпляра. После выведу список атрибутов экземпляра z7 и увижу, что в нем появился атрибут rozden @@ -199,7 +212,8 @@ dir(z7) 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'] ``` -#### Этот атрибут не появился. Атрибут rozden был добавлен только к экземпляру z7, но не к классу Class3. Изменения на уровне экземпляра не влияют на класс + +Этот атрибут не появился. Атрибут rozden был добавлен только к экземпляру z7, но не к классу Class3. Изменения на уровне экземпляра не влияют на класс # 6. Выявление родительских классов ### Такое выявление делается с помощью специального атрибута __bases__ @@ -261,7 +275,8 @@ Traceback (most recent call last): return sam.__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. Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. ### Создам модуль SAU.py с классом