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

@ -14,6 +14,11 @@ class Employee:
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Демонстрация завершена")

@ -19,6 +19,11 @@ class Employee:
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
@ -160,15 +163,13 @@ if __name__ == "__main__":
Оклад сотрудника Петров Алексей Сергеевич повышен на 10000. Новый оклад: 60000
Сотрудник Петров Алексей Сергеевич переведен из отдела '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 с классом
![alt text]({320D0C4C-177D-4114-B480-E6A8F4141636}.png)
### Тестирование класса произведу с помощью следующей программы:
@ -289,4 +289,5 @@ y= 0.8336163607592184
y= 0.8337101315489143
y= 0.833654237067147
```
### Построился график переходного процесса системы
![alt text]({82D74A71-F422-40D3-B0B4-C48328364C87}.png)

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