SneguraDS 1 месяц назад
Родитель a70c56d48d
Сommit 8771f84b1c

@ -14,6 +14,11 @@ class Employee:
self.oklad = oklad self.oklad = oklad
self.__pooshreniya = [] # приватный атрибут для хранения поощрений self.__pooshreniya = [] # приватный атрибут для хранения поощрений
# Создаем свойство без декораторов
self.pooshreniya = property(self._get_pooshreniya,
self._set_pooshreniya,
self._del_pooshreniya)
def povysit_oklad(self, summa): def povysit_oklad(self, summa):
""" """
Метод для повышения оклада сотрудника на заданную сумму Метод для повышения оклада сотрудника на заданную сумму
@ -40,14 +45,12 @@ class Employee:
self.dolzhnost = novaya_dolzhnost self.dolzhnost = novaya_dolzhnost
print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'") print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'")
# Свойство для работы с поощрениями # Методы для свойства pooshreniya (вместо декораторов)
@property def _get_pooshreniya(self):
def pooshreniya(self):
"""Геттер для получения списка поощрений""" """Геттер для получения списка поощрений"""
return self.__pooshreniya return self.__pooshreniya
@pooshreniya.setter def _set_pooshreniya(self, value):
def pooshreniya(self, value):
"""Сеттер для добавления нового поощрения""" """Сеттер для добавления нового поощрения"""
if isinstance(value, str): if isinstance(value, str):
self.__pooshreniya.append(value) self.__pooshreniya.append(value)
@ -58,8 +61,7 @@ class Employee:
else: else:
print("Поощрение должно быть строкой или списком строк") print("Поощрение должно быть строкой или списком строк")
@pooshreniya.deleter def _del_pooshreniya(self):
def pooshreniya(self):
"""Делитер для очистки списка поощрений""" """Делитер для очистки списка поощрений"""
self.__pooshreniya.clear() self.__pooshreniya.clear()
print(f"Список поощрений сотрудника {self.fio} очищен") print(f"Список поощрений сотрудника {self.fio} очищен")
@ -82,6 +84,7 @@ class Employee:
print(f"Оклад: {self.oklad} руб.") print(f"Оклад: {self.oklad} руб.")
print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}") print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}")
# Демонстрационная программа # Демонстрационная программа
if __name__ == "__main__": if __name__ == "__main__":
print("Демонстрация работы класса EMPLOYEE\n") print("Демонстрация работы класса EMPLOYEE\n")
@ -127,4 +130,4 @@ if __name__ == "__main__":
del sotrudnik2.pooshreniya del sotrudnik2.pooshreniya
sotrudnik2.otobrazit_informaciyu() sotrudnik2.otobrazit_informaciyu()
print("\nДемострация завершена") print("\nДемонстрация завершена")

@ -19,6 +19,11 @@ class Employee:
self.oklad = oklad self.oklad = oklad
self.__pooshreniya = [] # приватный атрибут для хранения поощрений self.__pooshreniya = [] # приватный атрибут для хранения поощрений
# Создаем свойство без декораторов
self.pooshreniya = property(self._get_pooshreniya,
self._set_pooshreniya,
self._del_pooshreniya)
def povysit_oklad(self, summa): def povysit_oklad(self, summa):
""" """
Метод для повышения оклада сотрудника на заданную сумму Метод для повышения оклада сотрудника на заданную сумму
@ -45,14 +50,12 @@ class Employee:
self.dolzhnost = novaya_dolzhnost self.dolzhnost = novaya_dolzhnost
print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'") print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'")
# Свойство для работы с поощрениями # Методы для свойства pooshreniya (вместо декораторов)
@property def _get_pooshreniya(self):
def pooshreniya(self):
"""Геттер для получения списка поощрений""" """Геттер для получения списка поощрений"""
return self.__pooshreniya return self.__pooshreniya
@pooshreniya.setter def _set_pooshreniya(self, value):
def pooshreniya(self, value):
"""Сеттер для добавления нового поощрения""" """Сеттер для добавления нового поощрения"""
if isinstance(value, str): if isinstance(value, str):
self.__pooshreniya.append(value) self.__pooshreniya.append(value)
@ -63,8 +66,7 @@ class Employee:
else: else:
print("Поощрение должно быть строкой или списком строк") print("Поощрение должно быть строкой или списком строк")
@pooshreniya.deleter def _del_pooshreniya(self):
def pooshreniya(self):
"""Делитер для очистки списка поощрений""" """Делитер для очистки списка поощрений"""
self.__pooshreniya.clear() self.__pooshreniya.clear()
print(f"Список поощрений сотрудника {self.fio} очищен") print(f"Список поощрений сотрудника {self.fio} очищен")
@ -87,6 +89,7 @@ class Employee:
print(f"Оклад: {self.oklad} руб.") print(f"Оклад: {self.oklad} руб.")
print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}") print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}")
# Демонстрационная программа # Демонстрационная программа
if __name__ == "__main__": if __name__ == "__main__":
print("Демонстрация работы класса EMPLOYEE\n") print("Демонстрация работы класса EMPLOYEE\n")
@ -132,7 +135,7 @@ if __name__ == "__main__":
del sotrudnik2.pooshreniya del sotrudnik2.pooshreniya
sotrudnik2.otobrazit_informaciyu() sotrudnik2.otobrazit_informaciyu()
print("\nДемострация завершена") print("\nДемонстрация завершена")
``` ```
## Получу следующее: ## Получу следующее:
```py ```py
@ -160,15 +163,13 @@ if __name__ == "__main__":
Оклад сотрудника Петров Алексей Сергеевич повышен на 10000. Новый оклад: 60000 Оклад сотрудника Петров Алексей Сергеевич повышен на 10000. Новый оклад: 60000
Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки' Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки'
Сотрудник Петров Алексей Сергеевич переведен с должности 'Программист' на должность 'Старший программист' Сотрудник Петров Алексей Сергеевич переведен с должности 'Программист' на должность 'Старший программист'
Добавлено поощрение для Петров Алексей Сергеевич: 'Благодарность за успешный проект'
Добавлено поощрение для Петров Алексей Сергеевич: 'Премия за квартал'
ФИО: Петров Алексей Сергеевич ФИО: Петров Алексей Сергеевич
Отдел: Отдел разработки Отдел: Отдел разработки
Должность: Старший программист Должность: Старший программист
Оклад: 60000 руб. Оклад: 60000 руб.
Поощрения: ['Благодарность за успешный проект', 'Премия за квартал'] Поощрения: нет
4. Операции со вторым сотрудником: 4. Операции со вторым сотрудником:
Оклад сотрудника Сидорова Мария Петровна повышен на 5000. Новый оклад: 80000 Оклад сотрудника Сидорова Мария Петровна повышен на 5000. Новый оклад: 80000
@ -183,28 +184,26 @@ if __name__ == "__main__":
Поощрения: ['Благодарность за годовой отчет'] Поощрения: ['Благодарность за годовой отчет']
5. Работа со свойствами: 5. Работа со свойствами:
Поощрения Петров Алексей Сергеевич: ['Благодарность за успешный проект', 'Премия за квартал'] Поощрения Петров Алексей Сергеевич: Премия за квартал
Поощрения Сидорова Мария Петровна: ['Благодарность за годовой отчет'] Поощрения Сидорова Мария Петровна: <property object at 0x0000026057B9E5C0>
6. Добавление нескольких поощрений: 6. Добавление нескольких поощрений:
Добавлены поощрения для Петров Алексей Сергеевич: ['Почетная грамота', 'Ценный подарок']
ФИО: Петров Алексей Сергеевич ФИО: Петров Алексей Сергеевич
Отдел: Отдел разработки Отдел: Отдел разработки
Должность: Старший программист Должность: Старший программист
Оклад: 60000 руб. Оклад: 60000 руб.
Поощрения: ['Благодарность за успешный проект', 'Премия за квартал', 'Почетная грамота', 'Ценный подарок'] Поощрения: нет
7. Очистка поощрений: 7. Очистка поощрений:
Список поощрений сотрудника Сидорова Мария Петровна очищен
ФИО: Сидорова Мария Петровна ФИО: Сидорова Мария Петровна
Отдел: Финансовый отдел Отдел: Финансовый отдел
Должность: Главный бухгалтер Должность: Главный бухгалтер
Оклад: 80000 руб. Оклад: 80000 руб.
Поощрения: нет Поощрения: ['Благодарность за годовой отчет']
Демострация завершена Демонстрация завершена
``` ```

@ -1,7 +1,7 @@
# 1. Запустили интерактивную оболочку IDLE, открыли окно текстового редактора # 1. Запустили интерактивную оболочку IDLE, открыли окно текстового редактора
# 2. Создание классов и их наследников # 2. Создание классов и их наследников
## 2.1. Создание автономного класса ## 2.1. Создание автономного класса
#### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы ### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы
```py ```py
class Class1: #Объявление класса class Class1: #Объявление класса
def zad_zn(self,znach): #Метод 1 класса1 – задание значения data def zad_zn(self,znach): #Метод 1 класса1 – задание значения data
@ -45,7 +45,7 @@ class Class2(Class1): #Class2 - наследник класса Class1
```py ```py
z3=Class2() z3=Class2()
``` ```
### Посмотрим список его атрибутов ### Посмотрю список его атрибутов
```py ```py
dir(z3) 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'] ['__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']
@ -54,13 +54,13 @@ dir(z3)
```py ```py
z3.zad_zn('Совсем новое') z3.zad_zn('Совсем новое')
``` ```
### Отобразите его для контроля ### Отображу его для контроля
```py ```py
z3.otobrazh() z3.otobrazh()
значение= Совсем новое значение= Совсем новое
``` ```
### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализируем, метод какого класса сработал при выводе этого значения. #### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализирую, метод какого класса сработал при выводе этого значения.
### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод #### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод
### Для проверки отображу значение данного data у первого экземпляра первого класса ### Для проверки отображу значение данного data у первого экземпляра первого класса
```py ```py
@ -91,7 +91,7 @@ Traceback (most recent call last):
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() никогда не вызывался
### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data #### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data
### Попробую иначе ### Попробую иначе
```py ```py
@ -119,8 +119,8 @@ 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. Использование специальных методов
### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__ #### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__
### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным #### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным
### Cоздам класс, содержащий два специальных метода ### Cоздам класс, содержащий два специальных метода
```py ```py
@ -227,7 +227,7 @@ ZeroDivisionError.__mro__
``` ```
# 7. Создание свойства класса. # 7. Создание свойства класса.
### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута #### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута
### Создам новый класс с определенным в нем свойством. Здесь имеется 3 метода: chten, zapis, stiran, которые обслуживают созданное свойство, реализуя операции, соответственно, чтения, записи или удаления значений свойства ### Создам новый класс с определенным в нем свойством. Здесь имеется 3 метода: chten, zapis, stiran, которые обслуживают созданное свойство, реализуя операции, соответственно, чтения, записи или удаления значений свойства
```py ```py
class Class4: class Class4:
@ -260,7 +260,7 @@ 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 с классом
![alt text]({320D0C4C-177D-4114-B480-E6A8F4141636}.png) ![alt text]({320D0C4C-177D-4114-B480-E6A8F4141636}.png)
### Тестирование класса произведу с помощью следующей программы: ### Тестирование класса произведу с помощью следующей программы:
@ -289,4 +289,5 @@ y= 0.8336163607592184
y= 0.8337101315489143 y= 0.8337101315489143
y= 0.833654237067147 y= 0.833654237067147
``` ```
### Построился график переходного процесса системы
![alt text]({82D74A71-F422-40D3-B0B4-C48328364C87}.png) ![alt text]({82D74A71-F422-40D3-B0B4-C48328364C87}.png)

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