diff --git a/TEMA9/Mod3.py b/TEMA9/Mod3.py new file mode 100644 index 0000000..bb1968b --- /dev/null +++ b/TEMA9/Mod3.py @@ -0,0 +1,10 @@ +class Class1: #Объявление класса Class1 в модуле + def zad_zn(self,znach): # 1 Метод класса + self.data=znach # self - ссылка на экземпляр класса Class1 + def otobrazh(self): # 2 Метод класса + print(self.data)#Отображение данных экземпляра +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 + print('значение=',self.data)#Отображение данных экземпляра +def otobrazh(objekt): #Объявление самостоятельной функции + print('значение объекта=',objekt) diff --git a/TEMA9/SAU.py b/TEMA9/SAU.py new file mode 100644 index 0000000..c26cdbf --- /dev/null +++ b/TEMA9/SAU.py @@ -0,0 +1,23 @@ +class SAU: + def __init__(self,zn_param): + self.param=zn_param + self.ypr=[0,0] + + def zdn_zn(self,upr): + self.x=upr + + def model(self): + def inerz(x,T,yy): + return (x+T*yy)/(T+1) + + y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2 + y1=self.param[0]*y0 #Усилитель1 + y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1 + y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2 + self.ypr[0]=y2 + self.ypr[1]=y3 + + def otobraz(self): + print('y=',self.ypr[1]) + + diff --git a/TEMA9/Sotrudnik.py b/TEMA9/Sotrudnik.py new file mode 100644 index 0000000..fe8041e --- /dev/null +++ b/TEMA9/Sotrudnik.py @@ -0,0 +1,29 @@ +class Sotrudnik: + def __init__(self, fio, otdel="не указан", dolzhnost="не указана", oklad=30000): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self._pooshreniya = [] + + def povysit_oklad(self, summa): + """Повысить оклад на заданную сумму""" + self.oklad += summa + + def perevesti_v_otdel(self, novy_otdel): + """Перевести в другой отдел""" + self.otdel = novy_otdel + + def izmenit_dolzhnost(self, novaya_dolzhnost): + """Изменить должность""" + self.dolzhnost = novaya_dolzhnost + + @property + def pooshreniya(self): + """Свойство для списка поощрений""" + return self._pooshreniya + + @pooshreniya.setter + def pooshreniya(self, znachenie): + """Добавить поощрение""" + self._pooshreniya.append(znachenie) \ No newline at end of file diff --git a/TEMA9/images/SAU1.png b/TEMA9/images/SAU1.png new file mode 100644 index 0000000..eaa023b Binary files /dev/null and b/TEMA9/images/SAU1.png differ diff --git a/TEMA9/images/SAU2.png b/TEMA9/images/SAU2.png new file mode 100644 index 0000000..d286a22 Binary files /dev/null and b/TEMA9/images/SAU2.png differ diff --git a/TEMA9/images/SAU3.png b/TEMA9/images/SAU3.png new file mode 100644 index 0000000..482ffd4 Binary files /dev/null and b/TEMA9/images/SAU3.png differ diff --git a/TEMA9/mainSAU.py b/TEMA9/mainSAU.py new file mode 100644 index 0000000..95a2a50 --- /dev/null +++ b/TEMA9/mainSAU.py @@ -0,0 +1,15 @@ +###main_SAU +from SAU import SAU +import pylab + +prm=[10,0.1,0.1,10] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь +xx=[0]+[1]*20 #Входной сигнал – «ступенька» +SAUe=SAU(prm) # Создаём экземпляр класса +yt=[] +for xt in xx: # Прохождение входного сигнала + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobraz() + yt.append(SAUe.ypr[1]) +pylab.plot(yt) +pylab.show() diff --git a/TEMA9/report.md b/TEMA9/report.md new file mode 100644 index 0000000..a461f49 --- /dev/null +++ b/TEMA9/report.md @@ -0,0 +1,476 @@ +# Отчет по теме 9. Создание пользовательских классов и объектов + +***Цель работы: Изучение средств объектно-ориентированного программирования в среде Python.*** + +Терехов Фёдор Валерьевич, А-01-23 + +>Класс в Python, как и в других языках программирования, - это элемент ПО, описывающий абстрактный тип данных и его частичную или полную реализацию. Классы – это основные инструменты объектно-ориентированного программирования (ООП) в языке Python. Они представляют собой шаблоны, образцы, по которым может быть создано множество объектов-экземпляров класса. У каждого класса есть уникальное имя и некоторый набор специфических для него атрибутов: полей (данных) и методов (функций), которые могут использоваться при работе с экземплярами класса. + +## 1. Создание классов и их наследников. + +### 1.1. Создание автономного класса. + +```python +class Class1: #Объявление класса + def zad_zn(self,znach): #Метод 1 класса1 – задание значения data + self.data=znach # self - ссылка на экземпляр класса + def otobrazh(self): # Метод 2 класса1 + print(self.data)#Отображение данных экземпляра класса + +z1=Class1() #Создаём 1-й экземпляр класса +z2=Class1() #Создаём 2-й экземпляр класса + +z1.zad_zn('экз.класса 1') #Обращение к методу класса у 1-го экз. +z2.zad_zn(-632.453) #Обращение к методу класса у 2-го экз. + +z1.otobrazh() # Обращение ко второму методу класса +z2.otobrazh() + +z1.data='Новое значение атрибута у экз.1' +z1.otobrazh() +``` + +Ответ программы: +```shell +экз.класса 1 +-632.453 +Новое значение атрибута у экз.1 +``` + +### 1.2. Создание класса-наследника. + +```python +class Class1: #Объявление класса + def zad_zn(self,znach): #Метод 1 класса1 – задание значения data + self.data=znach # self - ссылка на экземпляр класса + def otobrazh(self): # Метод 2 класса1 + print(self.data)#Отображение данных экземпляра класса + +z1=Class1() #Создаём 1-й экземпляр класса +z2=Class1() #Создаём 2-й экземпляр класса + +z1.zad_zn('экз.класса 1') #Обращение к методу класса у 1-го экз. +z2.zad_zn(-632.453) #Обращение к методу класса у 2-го экз. + +z1.data='Новое значение атрибута у экз.1' +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя + print('значение=',self.data)#Отображение данных экземпляра + +z3=Class2() +print(dir(z3)) +z3.zad_zn('Совсем новое') +z3.otobrazh() +z1.otobrazh() +del z1,z2,z3 +print('После удаления:',dir()) +``` + +Ответ программы: +```shell +['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_zn'] +значение= Совсем новое +Новое значение атрибута у экз.1 +После удаления: ['Class1', 'Class2', '__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__'] +``` + +*z1 и z3 - независимые объекты, изменение одного не влияет на другой* + +## 2. Использование классов, содержащихся в модулях. + +Mod3.py: +```python +class Class1: #Объявление класса Class1 в модуле + def zad_zn(self,znach): # 1 Метод класса + self.data=znach # self - ссылка на экземпляр класса Class1 + def otobrazh(self): # 2 Метод класса + print(self.data)#Отображение данных экземпляра +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 + print('значение=',self.data)#Отображение данных экземпляра +def otobrazh(objekt): #Объявление самостоятельной функции + print('значение объекта=',objekt) +``` + +Основная программа: +```python +from Mod3 import Class1 #Частичный импорт содержимого модуля +z4=Class1() +z4.otobrazh() +``` + +Ответ программы: +```shell +Traceback (most recent call last): + File "/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/TEMA9/task2.py", line 1, in + from Mod3 import Class1 #Частичный импорт содержимого модуля +ImportError: cannot import name 'Class1' from 'Mod3' (/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/TEMA9/Mod3.py) +``` + +***Сообщение об ошибке AttributeError: 'Class1' object has no attribute 'data' указывает на то, что объект класса Class1 не имеет атрибута data.*** + +```python +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +``` + +Ответ программы: +```shell +значение данного data у экз.4 +``` + +```python +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +del z4 +import Mod3 #Полный импорт содержимого модуля + +z4=Mod3.Class2() +z4.zad_zn('Класс из модуля') +z4.otobrazh() +Mod3.otobrazh('Объект') +``` + +Ответ программы: +```shell +значение данного data у экз.4 +значение= Класс из модуля +значение объекта= Объект +``` + +*Результаты вывода будут отличаться из-за того, что в первом случае был вызван метод otobrazh() для экземпляра z4, а во втором случае - для модуля Mod3. Также во втором случае z4 явлется экземпляром класса Class2, а в первом Class1.* + + +## 3. Использование специальных методов. + +>Имена специальных методов предваряются одним или двумя подчерками и имеют вид: __ <имя специального метода>__ + +```python +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor +print(dir(Class3)) +``` + +Ответ программы: +```shell +['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_dr_zn', 'zad_zn'] +``` + +>Метод __add__ - это один из методов, осуществляющих так называемую «перегрузку» операторов. + +Проверка работы методов: +```python +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor + +z5=Class3('abc') #При создании экземпляра срабатывает конструктор +z5.otobrazh() +z6=z5+'def' +z6.otobrazh() +z6.zad_dr_zn(3) +z6.otobrazh() +``` + +Ответ программы: +```shell +значение= abc +значение= abcdef +значение= abcdefabcdefabcdef +``` + +## 4. Присоединение атрибутов к классу. + +```python +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor + +print("Список атрибутов класса Class3:",dir(Class3)) +Class3.fio='Иванов И.И.' +print("\nСписок атрибутов класса Class3 после добавления атрибута:",dir(Class3)) +z7=Class3(123) +print("\nСписок атрибутов экземпляра z7:",dir(z7)) +print("\nСравнение списков атрибутов экземпляра z7 и класса Class3:",dir(z7)==dir(Class3)) +print("\nЗначение атрибута fio экземпляра z7:",z7.fio) +print("\nСравнение значения атрибута fio экземпляра z7 и класса Class3:",z7.fio==Class3.fio) +z7.rozden='1987' +print("\nСписок атрибутов экземпляра z7 после добавления атрибута",dir(z7)) +print("\nСравнение списков атрибутов экземпляра z7 и класса Class3 после добавления атрибута",dir(Class3)) +``` + +Ответ программы: +```shell +Список атрибутов класса Class3: ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'otobrazh', 'zad_dr_zn', 'zad_zn'] + +Список атрибутов класса Class3 после добавления атрибута: ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] + +Список атрибутов экземпляра z7: ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'zad_dr_zn', 'zad_zn'] + +Сравнение списков атрибутов экземпляра z7 и класса Class3: False + +Значение атрибута fio экземпляра z7: Иванов И.И. + +Сравнение значения атрибута fio экземпляра z7 и класса Class3: True + +Список атрибутов экземпляра z7 после добавления атрибута ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data', 'fio', 'otobrazh', 'rozden', 'zad_dr_zn', 'zad_zn'] + +Сравнение списков атрибутов экземпляра z7 и класса Class3 после добавления атрибута False +``` + + +* *После первой проверки выяснилось, что список атрибутов экземпляра не совпадает с атрибутами класса, так как у экземпляра z7 есть атрибут data.* +* *Значение атрибута fio у экземпляра z7 совпадает со значением атрибута класса.* +* *Атрибут rozden не появился у Class3, так как z7.rozden='1987' создает атрибут только у экземпляра z7, класс Class3 не меняется. + +## 5. Выявление родительских классов. + +```python +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor + +print("Родительский класс Class3:", Class3.__bases__) +print("\nРодительский класс Class2:", Class2.__bases__) +print("\nЦепочка наследования Class3:", Class3.__mro__) +print("\nЦепочка наследования для встроенного класса ошибок «деление на ноль»:", ZeroDivisionError.__mro__) +``` + +Ответ программы: +```shell +Родительский класс Class3: (,) + +Родительский класс Class2: (,) + +Цепочка наследования Class3: (, , , ) + +Цепочка наследования для встроенного класса ошибок «деление на ноль»: (, , , , ) +``` + +## 6. Создание свойства класса. + +>Свойство (property) класса – это особый атрибут класса, с которым можно производить операции чтения или задания его значения, а также удаление значения этого атрибута. + +```python +class Class4: + def __init__(sam,znach): + sam.__prm=znach + def chten(sam): + return sam.__prm + def zapis(sam,znch): + sam.__prm=znch + def stiran(sam): + del sam.__prm + svojstvo=property(chten,zapis,stiran) + +exempl=Class4(12) +print(exempl.svojstvo) +exempl.svojstvo=45 +print(exempl.svojstvo) +del exempl.svojstvo +#print(exempl.svojstvo) +``` + +Ответ программы: +```shell +12 +45 +``` + +Если добавить в конце "print(exempl.svojstvo)": +```python +class Class4: + def __init__(sam,znach): + sam.__prm=znach + def chten(sam): + return sam.__prm + def zapis(sam,znch): + sam.__prm=znch + def stiran(sam): + del sam.__prm + svojstvo=property(chten,zapis,stiran) + +exempl=Class4(12) +print(exempl.svojstvo) +exempl.svojstvo=45 +print(exempl.svojstvo) +del exempl.svojstvo +print(exempl.svojstvo) +``` + +Ответ программы: +```shell +12 +45 +Traceback (most recent call last): + File "/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/TEMA9/task5.py", line 17, in + print(exempl.svojstvo) + File "/Users/fedorterekhov/Library/Mobile Documents/com~apple~CloudDocs/Учёба/3 курс/POAS_labs/python-labs/TEMA9/task5.py", line 5, in chten + return sam.__prm +AttributeError: 'Class4' object has no attribute '_Class4__prm' +``` + +*del exempl.svojstvo вызывает метод stiran(), stiran() выполняет del sam.__prm. После этого атрибут __prm удален из объекта. При попытке print(exempl.svojstvo) снова вызывается chten(). chten() пытается вернуть sam.__prm, но его уже нет.* + + +## 7. Пример представления в виде класса модели системы автоматического регулирования (САР). + +>Пример представления в виде класса модели системы автоматического регулирования (САР), состоящей из последовательного соединения усилителя и двух инерционных звеньев, охваченных отрицательной обратной связью с усилителем. + +Модуль SAU: +```python +class SAU: + def __init__(self,zn_param): + self.param=zn_param + self.ypr=[0,0] + + def zdn_zn(self,upr): + self.x=upr + + def model(self): + def inerz(x,T,yy): + return (x+T*yy)/(T+1) + + y0=self.x-self.ypr[1]*self.param[3] #Обр.связь с усилителем 2 + y1=self.param[0]*y0 #Усилитель1 + y2=inerz(y1,self.param[1],self.ypr[0]) #Инерционное звено1 + y3=inerz(y2,self.param[2],self.ypr[1]) #Инерционное звено2 + self.ypr[0]=y2 + self.ypr[1]=y3 + + def otobraz(self): + print('y=',self.ypr[1]) + + +``` + +***Параметры prm=[2.5,4,1.3,0.8]*** + +Основная программа mainSAU: +```python +###main_SAU +from SAU import SAU +import pylab + +prm=[2.5,4,1.3,0.8] #Параметры модели: коэф.усиления, 2 пост.времени, обратная связь +xx=[0]+[1]*20 #Входной сигнал – «ступенька» +SAUe=SAU(prm) # Создаём экземпляр класса +yt=[] +for xt in xx: # Прохождение входного сигнала + SAUe.zdn_zn(xt) + SAUe.model() + SAUe.otobraz() + yt.append(SAUe.ypr[1]) +pylab.plot(yt) +pylab.show() +``` + +Ответ программы: +```shell +y= 0.0 +y= 0.2173913043478261 +y= 0.4763705103969754 +y= 0.686594887811293 +y= 0.8199324616478645 +y= 0.8837201137353929 +y= 0.8994188484874774 +y= 0.8892777072047301 +y= 0.870097963179993 +y= 0.8518346102696789 +y= 0.8387499784485772 +y= 0.8314204114211459 +y= 0.8286051955249649 +y= 0.8285656555914835 +y= 0.8297915186846528 +y= 0.8312697736438287 +y= 0.8324765218921963 +y= 0.8332456979978418 +y= 0.8336163607592184 +y= 0.8337101315489143 +y= 0.833654237067147 +``` + +![График САУ1](images/SAU1.png) + +***Параметры prm=[5,1,1.5,0.4]*** + +Ответ программы: +```shell +y= 0.0 +y= 1.0 +y= 1.7 +y= 1.89 +y= 1.813 +y= 1.7021000000000002 +y= 1.64757 +y= 1.6426689999999997 +y= 1.6555972999999997 +y= 1.6661174099999996 +y= 1.6696029969999997 +y= 1.6688868749 +y= 1.6673399133300002 +y= 1.666471876861 +y= 1.6663283398036999 +y= 1.66648827480429 +y= 1.6666432904218929 +y= 1.666703820854038 +y= 1.6666996874712587 +y= 1.6666786349736697 +y= 1.6666651382401914 +``` + +![График САУ2](images/SAU2.png) + +***Параметры prm=[10,0.1,0.1,10]*** + +Ответ программы: +```shell +y= 0.0 +y= 8.264462809917354 +y= -673.2463629533501 +y= 55525.98301723731 +y= -4578814.754542403 +y= 377581480.12265354 +y= -31136391973.95935 +y= 2567591252361.0435 +y= -211730532063351.34 +y= 1.7459873399478246e+16 +y= -1.439788471483156e+18 +y= 1.1872885874864076e+20 +y= -9.79070341161542e+21 +y= 8.073679331590074e+23 +y= -6.657774749055506e+25 +y= 5.490181463577067e+27 +y= -4.5273524021342546e+29 +y= 3.73337746832074e+31 +y= -3.07864422358515e+33 +y= 2.538733448690739e+35 +y= -2.0935083937680952e+37 +``` + +![График САУ3](images/SAU3.png) diff --git a/TEMA9/task.md b/TEMA9/task.md new file mode 100644 index 0000000..a65b4db --- /dev/null +++ b/TEMA9/task.md @@ -0,0 +1,97 @@ +# Общее контрольное задание. + +Создайте и запишите в модуль класс, содержащий следующие компоненты: +- конструктор, задающий четырем атрибутам (fio, otdel, dolzhnost, oklad), представляющим фамилии сотрудников, название отделов, названия должностей сотрудников и размеры их окладов, некоторые начальные значения; +- метод для обеспечения операции повышения оклада сотрудника на заданное значение; +- метод для обеспечения перевода сотрудника из одного отдела в другой; +- метод для изменения должности сотрудника; +- свойство, содержащее перечень (список) поощрений сотрудника. +Создайте 2 экземпляра класса, задайте им некоторые значения атрибутов и свойства. Отобразите эти значения. Попробуйте с этими экземплярами операции перевода из отдела в отдел, изменения должности и оклада, объявления благодарности. + +Модуль Sotrudnik.py: +```python +class Sotrudnik: + def __init__(self, fio, otdel="не указан", dolzhnost="не указана", oklad=30000): + self.fio = fio + self.otdel = otdel + self.dolzhnost = dolzhnost + self.oklad = oklad + self._pooshreniya = [] + + def povysit_oklad(self, summa): + """Повысить оклад на заданную сумму""" + self.oklad += summa + + def perevesti_v_otdel(self, novy_otdel): + """Перевести в другой отдел""" + self.otdel = novy_otdel + + def izmenit_dolzhnost(self, novaya_dolzhnost): + """Изменить должность""" + self.dolzhnost = novaya_dolzhnost + + @property + def pooshreniya(self): + """Свойство для списка поощрений""" + return self._pooshreniya + + @pooshreniya.setter + def pooshreniya(self, znachenie): + """Добавить поощрение""" + self._pooshreniya.append(znachenie) +``` + +Основная программа: +```python +from Sotrudnik import Sotrudnik + +s1 = Sotrudnik("Иванов И.И.", "IT", "программист", 80000) +s2 = Sotrudnik("Петрова М.С.", "бухгалтерия", "бухгалтер") + + +print("Начальные данные:") +print(f"{s1.fio}: {s1.otdel}, {s1.dolzhnost}, {s1.oklad} руб.") +print(f"{s2.fio}: {s2.otdel}, {s2.dolzhnost}, {s2.oklad} руб.") + + +print("\nОперации с первым сотрудником:") +print("Переведён в отдел \"разработка\" на должность \"старший программист\"") +s1.perevesti_v_otdel("разработка") +s1.izmenit_dolzhnost("старший программист") +print("Повышен оклад на 15 000 руб.") +s1.povysit_oklad(15000) +s1.pooshreniya = "благодарность за проект" + +# Операции со вторым сотрудником +print("\nОперации со вторым сотрудником:") +s2.povysit_oklad(10000) +s2.pooshreniya = "премия за квартал" + +# Отображаем итоговые значения +print("\nИтоговые данные:") +print(f"{s1.fio}: {s1.otdel}, {s1.dolzhnost}, {s1.oklad} руб.") +print(f"Поощрения: {s1.pooshreniya}") + +print(f"\n{s2.fio}: {s2.otdel}, {s2.dolzhnost}, {s2.oklad} руб.") +print(f"Поощрения: {s2.pooshreniya}") +``` + +Ответ программы: +```shell +Начальные данные: +Иванов И.И.: IT, программист, 80000 руб. +Петрова М.С.: бухгалтерия, бухгалтер, 30000 руб. + +Операции с первым сотрудником: +Переведён в отдел "разработка" на должность "старший программист" +Повышен оклад на 15 000 руб. + +Операции со вторым сотрудником: + +Итоговые данные: +Иванов И.И.: разработка, старший программист, 95000 руб. +Поощрения: ['благодарность за проект'] + +Петрова М.С.: бухгалтерия, бухгалтер, 40000 руб. +Поощрения: ['премия за квартал'] +``` \ No newline at end of file diff --git a/TEMA9/task1.py b/TEMA9/task1.py new file mode 100644 index 0000000..7a945ed --- /dev/null +++ b/TEMA9/task1.py @@ -0,0 +1,24 @@ +class Class1: #Объявление класса + def zad_zn(self,znach): #Метод 1 класса1 – задание значения data + self.data=znach # self - ссылка на экземпляр класса + def otobrazh(self): # Метод 2 класса1 + print(self.data)#Отображение данных экземпляра класса + +z1=Class1() #Создаём 1-й экземпляр класса +z2=Class1() #Создаём 2-й экземпляр класса + +z1.zad_zn('экз.класса 1') #Обращение к методу класса у 1-го экз. +z2.zad_zn(-632.453) #Обращение к методу класса у 2-го экз. + +z1.data='Новое значение атрибута у экз.1' +class Class2(Class1): #Class2 - наследник класса Class1 + def otobrazh(self): # Метод класса Class2 – переопределяет метод родителя + print('значение=',self.data)#Отображение данных экземпляра + +z3=Class2() +print(dir(z3)) +z3.zad_zn('Совсем новое') +z3.otobrazh() +z1.otobrazh() +del z1,z2,z3 +print('После удаления:',dir()) \ No newline at end of file diff --git a/TEMA9/task2.py b/TEMA9/task2.py new file mode 100644 index 0000000..69404e9 --- /dev/null +++ b/TEMA9/task2.py @@ -0,0 +1,11 @@ +from Mod3 import Class1 +z4=Class1() +z4.data='значение данного data у экз.4' +z4.otobrazh() +del z4 +import Mod3 #Полный импорт содержимого модуля + +z4=Mod3.Class2() +z4.zad_zn('Класс из модуля') +z4.otobrazh() +Mod3.otobrazh('Объект') diff --git a/TEMA9/task3.py b/TEMA9/task3.py new file mode 100644 index 0000000..b36050a --- /dev/null +++ b/TEMA9/task3.py @@ -0,0 +1,20 @@ +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor + +print("Список атрибутов класса Class3:",dir(Class3)) +Class3.fio='Иванов И.И.' +print("\nСписок атрибутов класса Class3 после добавления атрибута:",dir(Class3)) +z7=Class3(123) +print("\nСписок атрибутов экземпляра z7:",dir(z7)) +print("\nСравнение списков атрибутов экземпляра z7 и класса Class3:",dir(z7)==dir(Class3)) +print("\nЗначение атрибута fio экземпляра z7:",z7.fio) +print("\nСравнение значения атрибута fio экземпляра z7 и класса Class3:",z7.fio==Class3.fio) +z7.rozden='1987' +print("\nСписок атрибутов экземпляра z7 после добавления атрибута",dir(z7)) +print("\nСравнение списков атрибутов экземпляра z7 и класса Class3 после добавления атрибута",dir(z7)==dir(Class3)) \ No newline at end of file diff --git a/TEMA9/task4.py b/TEMA9/task4.py new file mode 100644 index 0000000..7bb691a --- /dev/null +++ b/TEMA9/task4.py @@ -0,0 +1,13 @@ +from Mod3 import Class2 #Частичный импорт содержимого модуля Mod3 +class Class3(Class2): #Наследник класса Class2, а через него – и класса Class1 + def __init__(self,znach): #Конструктор-вызывается при создании нового экземпляра класса + self.data=znach + def __add__(self,drug_zn): #Вызывается, когда экземпляр участвует в операции «+» + return Class3(self.data+drug_zn) + def zad_dr_zn(self,povtor): #А это - обычный метод + self.data*=povtor + +print("Родительский класс Class3:", Class3.__bases__) +print("\nРодительский класс Class2:", Class2.__bases__) +print("\nЦепочка наследования Class3:", Class3.__mro__) +print("\nЦепочка наследования для встроенного класса ошибок «деление на ноль»:", ZeroDivisionError.__mro__) \ No newline at end of file diff --git a/TEMA9/task5.py b/TEMA9/task5.py new file mode 100644 index 0000000..231641a --- /dev/null +++ b/TEMA9/task5.py @@ -0,0 +1,17 @@ +class Class4: + def __init__(sam,znach): + sam.__prm=znach + def chten(sam): + return sam.__prm + def zapis(sam,znch): + sam.__prm=znch + def stiran(sam): + del sam.__prm + svojstvo=property(chten,zapis,stiran) + +exempl=Class4(12) +print(exempl.svojstvo) +exempl.svojstvo=45 +print(exempl.svojstvo) +del exempl.svojstvo +print(exempl.svojstvo) \ No newline at end of file diff --git a/TEMA9/test_sotrudnik.py b/TEMA9/test_sotrudnik.py new file mode 100644 index 0000000..666935b --- /dev/null +++ b/TEMA9/test_sotrudnik.py @@ -0,0 +1,31 @@ +from Sotrudnik import Sotrudnik + +s1 = Sotrudnik("Иванов И.И.", "IT", "программист", 80000) +s2 = Sotrudnik("Петрова М.С.", "бухгалтерия", "бухгалтер") + + +print("Начальные данные:") +print(f"{s1.fio}: {s1.otdel}, {s1.dolzhnost}, {s1.oklad} руб.") +print(f"{s2.fio}: {s2.otdel}, {s2.dolzhnost}, {s2.oklad} руб.") + + +print("\nОперации с первым сотрудником:") +print("Переведён в отдел \"разработка\" на должность \"старший программист\"") +s1.perevesti_v_otdel("разработка") +s1.izmenit_dolzhnost("старший программист") +print("Повышен оклад на 15 000 руб.") +s1.povysit_oklad(15000) +s1.pooshreniya = "благодарность за проект" + +# Операции со вторым сотрудником +print("\nОперации со вторым сотрудником:") +s2.povysit_oklad(10000) +s2.pooshreniya = "премия за квартал" + +# Отображаем итоговые значения +print("\nИтоговые данные:") +print(f"{s1.fio}: {s1.otdel}, {s1.dolzhnost}, {s1.oklad} руб.") +print(f"Поощрения: {s1.pooshreniya}") + +print(f"\n{s2.fio}: {s2.otdel}, {s2.dolzhnost}, {s2.oklad} руб.") +print(f"Поощрения: {s2.pooshreniya}") \ No newline at end of file