ответвлено от main/python-labs
lab9
Этот коммит содержится в:
@@ -13,6 +13,11 @@ class Employee:
|
||||
self.dolzhnost = dolzhnost
|
||||
self.oklad = oklad
|
||||
self.__pooshreniya = [] # приватный атрибут для хранения поощрений
|
||||
|
||||
# Создаем свойство без декораторов
|
||||
self.pooshreniya = property(self._get_pooshreniya,
|
||||
self._set_pooshreniya,
|
||||
self._del_pooshreniya)
|
||||
|
||||
def povysit_oklad(self, summa):
|
||||
"""
|
||||
@@ -40,14 +45,12 @@ class Employee:
|
||||
self.dolzhnost = novaya_dolzhnost
|
||||
print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'")
|
||||
|
||||
# Свойство для работы с поощрениями
|
||||
@property
|
||||
def pooshreniya(self):
|
||||
# Методы для свойства pooshreniya (вместо декораторов)
|
||||
def _get_pooshreniya(self):
|
||||
"""Геттер для получения списка поощрений"""
|
||||
return self.__pooshreniya
|
||||
|
||||
@pooshreniya.setter
|
||||
def pooshreniya(self, value):
|
||||
def _set_pooshreniya(self, value):
|
||||
"""Сеттер для добавления нового поощрения"""
|
||||
if isinstance(value, str):
|
||||
self.__pooshreniya.append(value)
|
||||
@@ -58,8 +61,7 @@ class Employee:
|
||||
else:
|
||||
print("Поощрение должно быть строкой или списком строк")
|
||||
|
||||
@pooshreniya.deleter
|
||||
def pooshreniya(self):
|
||||
def _del_pooshreniya(self):
|
||||
"""Делитер для очистки списка поощрений"""
|
||||
self.__pooshreniya.clear()
|
||||
print(f"Список поощрений сотрудника {self.fio} очищен")
|
||||
@@ -82,6 +84,7 @@ class Employee:
|
||||
print(f"Оклад: {self.oklad} руб.")
|
||||
print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}")
|
||||
|
||||
|
||||
# Демонстрационная программа
|
||||
if __name__ == "__main__":
|
||||
print("Демонстрация работы класса EMPLOYEE\n")
|
||||
@@ -127,4 +130,4 @@ if __name__ == "__main__":
|
||||
del sotrudnik2.pooshreniya
|
||||
sotrudnik2.otobrazit_informaciyu()
|
||||
|
||||
print("\nДемострация завершена")
|
||||
print("\nДемонстрация завершена")
|
||||
@@ -18,6 +18,11 @@ class Employee:
|
||||
self.dolzhnost = dolzhnost
|
||||
self.oklad = oklad
|
||||
self.__pooshreniya = [] # приватный атрибут для хранения поощрений
|
||||
|
||||
# Создаем свойство без декораторов
|
||||
self.pooshreniya = property(self._get_pooshreniya,
|
||||
self._set_pooshreniya,
|
||||
self._del_pooshreniya)
|
||||
|
||||
def povysit_oklad(self, summa):
|
||||
"""
|
||||
@@ -45,14 +50,12 @@ class Employee:
|
||||
self.dolzhnost = novaya_dolzhnost
|
||||
print(f"Сотрудник {self.fio} переведен с должности '{staraya_dolzhnost}' на должность '{novaya_dolzhnost}'")
|
||||
|
||||
# Свойство для работы с поощрениями
|
||||
@property
|
||||
def pooshreniya(self):
|
||||
# Методы для свойства pooshreniya (вместо декораторов)
|
||||
def _get_pooshreniya(self):
|
||||
"""Геттер для получения списка поощрений"""
|
||||
return self.__pooshreniya
|
||||
|
||||
@pooshreniya.setter
|
||||
def pooshreniya(self, value):
|
||||
def _set_pooshreniya(self, value):
|
||||
"""Сеттер для добавления нового поощрения"""
|
||||
if isinstance(value, str):
|
||||
self.__pooshreniya.append(value)
|
||||
@@ -63,8 +66,7 @@ class Employee:
|
||||
else:
|
||||
print("Поощрение должно быть строкой или списком строк")
|
||||
|
||||
@pooshreniya.deleter
|
||||
def pooshreniya(self):
|
||||
def _del_pooshreniya(self):
|
||||
"""Делитер для очистки списка поощрений"""
|
||||
self.__pooshreniya.clear()
|
||||
print(f"Список поощрений сотрудника {self.fio} очищен")
|
||||
@@ -87,6 +89,7 @@ class Employee:
|
||||
print(f"Оклад: {self.oklad} руб.")
|
||||
print(f"Поощрения: {self.__pooshreniya if self.__pooshreniya else 'нет'}")
|
||||
|
||||
|
||||
# Демонстрационная программа
|
||||
if __name__ == "__main__":
|
||||
print("Демонстрация работы класса EMPLOYEE\n")
|
||||
@@ -132,7 +135,7 @@ if __name__ == "__main__":
|
||||
del sotrudnik2.pooshreniya
|
||||
sotrudnik2.otobrazit_informaciyu()
|
||||
|
||||
print("\nДемострация завершена")
|
||||
print("\nДемонстрация завершена")
|
||||
```
|
||||
## Получу следующее:
|
||||
```py
|
||||
@@ -158,21 +161,19 @@ if __name__ == "__main__":
|
||||
|
||||
3. Операции с первым сотрудником:
|
||||
Оклад сотрудника Петров Алексей Сергеевич повышен на 10000. Новый оклад: 60000
|
||||
Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки'
|
||||
Сотрудник Петров Алексей Сергеевич переведен из отдела 'IT-отдел' в отдел 'Отдел разработки'
|
||||
Сотрудник Петров Алексей Сергеевич переведен с должности 'Программист' на должность 'Старший программист'
|
||||
Добавлено поощрение для Петров Алексей Сергеевич: 'Благодарность за успешный проект'
|
||||
Добавлено поощрение для Петров Алексей Сергеевич: 'Премия за квартал'
|
||||
|
||||
|
||||
ФИО: Петров Алексей Сергеевич
|
||||
Отдел: Отдел разработки
|
||||
Должность: Старший программист
|
||||
Оклад: 60000 руб.
|
||||
Поощрения: ['Благодарность за успешный проект', 'Премия за квартал']
|
||||
Поощрения: нет
|
||||
|
||||
4. Операции со вторым сотрудником:
|
||||
Оклад сотрудника Сидорова Мария Петровна повышен на 5000. Новый оклад: 80000
|
||||
Сотрудник Сидорова Мария Петровна переведен из отдела 'Бухгалтерия' в отдел 'Финансовый отдел'
|
||||
Сотрудник Сидорова Мария Петровна переведен из отдела 'Бухгалтерия' в отдел 'Финансовый отдел'
|
||||
Добавлено поощрение для Сидорова Мария Петровна: 'Благодарность за годовой отчет'
|
||||
|
||||
|
||||
@@ -183,28 +184,26 @@ if __name__ == "__main__":
|
||||
Поощрения: ['Благодарность за годовой отчет']
|
||||
|
||||
5. Работа со свойствами:
|
||||
Поощрения Петров Алексей Сергеевич: ['Благодарность за успешный проект', 'Премия за квартал']
|
||||
Поощрения Сидорова Мария Петровна: ['Благодарность за годовой отчет']
|
||||
Поощрения Петров Алексей Сергеевич: Премия за квартал
|
||||
Поощрения Сидорова Мария Петровна: <property object at 0x0000026057B9E5C0>
|
||||
|
||||
6. Добавление нескольких поощрений:
|
||||
Добавлены поощрения для Петров Алексей Сергеевич: ['Почетная грамота', 'Ценный подарок']
|
||||
|
||||
|
||||
ФИО: Петров Алексей Сергеевич
|
||||
Отдел: Отдел разработки
|
||||
Должность: Старший программист
|
||||
Оклад: 60000 руб.
|
||||
Поощрения: ['Благодарность за успешный проект', 'Премия за квартал', 'Почетная грамота', 'Ценный подарок']
|
||||
Поощрения: нет
|
||||
|
||||
7. Очистка поощрений:
|
||||
Список поощрений сотрудника Сидорова Мария Петровна очищен
|
||||
|
||||
|
||||
ФИО: Сидорова Мария Петровна
|
||||
Отдел: Финансовый отдел
|
||||
Должность: Главный бухгалтер
|
||||
Оклад: 80000 руб.
|
||||
Поощрения: нет
|
||||
Поощрения: ['Благодарность за годовой отчет']
|
||||
|
||||
Демострация завершена
|
||||
Демонстрация завершена
|
||||
```
|
||||
@@ -1,7 +1,7 @@
|
||||
# 1. Запустили интерактивную оболочку IDLE, открыли окно текстового редактора
|
||||
# 2. Создание классов и их наследников
|
||||
## 2.1. Создание автономного класса
|
||||
#### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы
|
||||
### Создам класс с именем Class1, содержащий 2 функции, реализующие его методы
|
||||
```py
|
||||
class Class1: #Объявление класса
|
||||
def zad_zn(self,znach): #Метод 1 класса1 – задание значения data
|
||||
@@ -45,7 +45,7 @@ class Class2(Class1): #Class2 - наследник класса Class1
|
||||
```py
|
||||
z3=Class2()
|
||||
```
|
||||
### Посмотрим список его атрибутов
|
||||
### Посмотрю список его атрибутов
|
||||
```py
|
||||
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']
|
||||
@@ -54,13 +54,13 @@ dir(z3)
|
||||
```py
|
||||
z3.zad_zn('Совсем новое')
|
||||
```
|
||||
### Отобразите его для контроля
|
||||
### Отображу его для контроля
|
||||
```py
|
||||
z3.otobrazh()
|
||||
значение= Совсем новое
|
||||
```
|
||||
### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализируем, метод какого класса сработал при выводе этого значения.
|
||||
### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод
|
||||
#### Поскольку метод otobrazh есть и у класса Class2, и у его родительского класса Class1, проанализирую, метод какого класса сработал при выводе этого значения.
|
||||
#### Сработал метод класса Class2. Это демонстрация переопределения методов в наследовании. Когда дочерний класс определяет метод с тем же именем, что и родительский класс, метод дочернего класса "перекрывает" родительский метод
|
||||
|
||||
### Для проверки отображу значение данного data у первого экземпляра первого класса
|
||||
```py
|
||||
@@ -91,7 +91,7 @@ Traceback (most recent call last):
|
||||
AttributeError: 'Class1' object has no attribute 'data'
|
||||
```
|
||||
#### Ошибка возникла потому, что у экземпляра z4 не был определен атрибут data. При запуске происходит следующее: создается экземпляр z4 класса Class1; вызывается метод otobrazh(), который пытается выполнить print(self.data); но атрибут data еще не был создан, так как метод zad_zn() никогда не вызывался
|
||||
### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data
|
||||
#### Решение: нужно сначала установить значение через метод zad_zn() или напрямую присвоить атрибут data
|
||||
|
||||
### Попробую иначе
|
||||
```py
|
||||
@@ -119,8 +119,8 @@ Mod3.otobrazh('Объект')
|
||||
#### Ключевые различия: метод класса работает с атрибутами экземпляра (self.data), самостоятельная функция работает с переданным ей аргументом (objekt), класс Class2 переопределил метод otobrazh, добавив префикс "значение=", разные способы импорта (from Mod3 import Class1 vs import Mod3) влияют на пространство имен
|
||||
|
||||
# 4. Использование специальных методов
|
||||
### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__
|
||||
### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным
|
||||
#### Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __<имя специального метода>__
|
||||
#### Специальные методы (dunder methods - double underscore) нужны для реализации определенного поведения объектов в Python. Их особенности: автоматический вызов - вызываются интерпретатором в определенных ситуациях; перегрузка операторов - позволяют определить поведение объектов при использовании операторов (+, -, *, / и т.д.); эмуляция встроенных типов - позволяют создаваемым классам вести себя как встроенные типы Python; контроль жизненного цикла - управление созданием, инициализацией и удалением объектов; синтаксический сахар - делают код более читаемым и интуитивно понятным
|
||||
|
||||
### Cоздам класс, содержащий два специальных метода
|
||||
```py
|
||||
@@ -227,7 +227,7 @@ ZeroDivisionError.__mro__
|
||||
```
|
||||
|
||||
# 7. Создание свойства класса.
|
||||
### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута
|
||||
#### Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута
|
||||
### Создам новый класс с определенным в нем свойством. Здесь имеется 3 метода: chten, zapis, stiran, которые обслуживают созданное свойство, реализуя операции, соответственно, чтения, записи или удаления значений свойства
|
||||
```py
|
||||
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
|
||||
|
||||
# 8. Рассмотрите пример представления в виде класса модели системы автоматического регулиро-вания (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем.
|
||||
# 8. Рассмотрите пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем.
|
||||
### Создам модуль SAU.py с классом
|
||||

|
||||
### Тестирование класса произведу с помощью следующей программы:
|
||||
@@ -289,4 +289,5 @@ y= 0.8336163607592184
|
||||
y= 0.8337101315489143
|
||||
y= 0.833654237067147
|
||||
```
|
||||
### Построился график переходного процесса системы
|
||||

|
||||
|
||||
Ссылка в новой задаче
Block a user