ответвлено от main/python-labs
lab9
Этот коммит содержится в:
@@ -13,6 +13,11 @@ class Employee:
|
|||||||
self.dolzhnost = dolzhnost
|
self.dolzhnost = dolzhnost
|
||||||
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Демонстрация завершена")
|
||||||
@@ -18,6 +18,11 @@ class Employee:
|
|||||||
self.dolzhnost = dolzhnost
|
self.dolzhnost = dolzhnost
|
||||||
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
|
||||||
@@ -158,21 +161,19 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
3. Операции с первым сотрудником:
|
3. Операции с первым сотрудником:
|
||||||
Оклад сотрудника Петров Алексей Сергеевич повышен на 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 с классом
|
||||||

|

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

|

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