Skip to content
Empty file added __init__.py
Empty file.
94 changes: 94 additions & 0 deletions lesson_8/hw01_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# Реализовать класс «Дата», функция-конструктор которого должна принимать дату в виде строки формата «день-месяц-год».
# В рамках класса реализовать два метода. Первый, с декоратором @classmethod, должен извлекать число, месяц, год
# и преобразовывать их тип к типу «Число». Второй, с декоратором @staticmethod, должен проводить валидацию числа,
# месяца и года (например, месяц — от 1 до 12). Проверить работу полученной структуры на реальных данных.


class DateValidationError(Exception):

def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)


class MyDate:
__day: int
__month: int
__year: int

@property
def day(self):
return self.__day

@day.setter
def day(self, value):
self.__day = value

@property
def month(self):
return self.__month

@month.setter
def month(self, value):
self.__month = value

@property
def year(self):
return self.__year

@year.setter
def year(self, value):
self.__year = value

@classmethod
def date_parser(cls, date_string):
date_list = date_string.split('-')
if len(date_list) == 3:
return int(date_list[0]), int(date_list[1]), int(date_list[2])

# первый член - число
# второй член - месяц
# третий член - год
@staticmethod
def date_analizer(*args):
if args:
day, month, year = args[0]
else:
raise ValueError(f'Передано значение: {args}')

day_pass, month_pass, year_pass = False, False, False

# валидируем день
if 1 >= day / 31 > 0 and isinstance(day, int):
day_pass = True
else:
raise DateValidationError('Проверьте день')

# валидируем месяц
if 1 >= month / 12 > 0 and isinstance(month, int):
month_pass = True
else:
raise DateValidationError('Проверьте месяц')

# валидируем год
if 3 >= year / 1000 > 0 and isinstance(month, int):
year_pass = True
else:
raise DateValidationError('Проверьте год')

return day_pass and month_pass and year_pass

def __init__(self, date_string):
date_tuple = self.date_parser(date_string)
if MyDate.date_analizer(date_tuple):
self.day = date_tuple[0]
self.month = date_tuple[1]
self.year = date_tuple[2]

def get_date(self):
return f'{self.day} - {self.month} - {self.year}'


mydate = MyDate('11-10-2001')
print(mydate.get_date())

mydate1 = MyDate('134-10-2001')
20 changes: 20 additions & 0 deletions lesson_8/hw02_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Создайте собственный класс-исключение, обрабатывающий ситуацию деления на нуль. Проверьте его работу на данных,
# вводимых пользователем. При вводе пользователем нуля в качестве делителя программа должна корректно обработать
# эту ситуацию и не завершиться с ошибкой.


class CustomZeroDivide(Exception):
def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)


try:
one = int(input('Введите первое число:\n'))
two = int(input('Введите второе число:\n'))
if two == 0:
raise CustomZeroDivide('Похоже, вы тут делаете то, что нельзя')
three = one / two
print(f'{one} / {two} = {one/two}')
except CustomZeroDivide:
print('Пожалуйста, не делите на ноль. Так нельзя\n')
print(f'{one} / {two} = ...')
38 changes: 38 additions & 0 deletions lesson_8/hw03_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Создайте собственный класс-исключение, который должен проверять содержимое списка на отсутствие элементов типа
# строка и булево. Проверить работу исключения на реальном примере. Необходимо запрашивать у пользователя данные
# и заполнять список. Класс-исключение должен контролировать типы данных элементов списка.


class ListDataError(Exception):
def __init__(self, *args, **kwargs):
Exception.__init__(self, *args, **kwargs)


def is_float(value):
try:
float(value)
return True
except ValueError:
return False


my_list = []
buffer = None

while buffer != '':
print(f'Текущее состояние списка: {my_list}')
buffer = input('Введите новое значение для списка:\n')
try:
if buffer == 'True' or buffer == 'False':
raise ListDataError('Вы пытаетесь записать в список логическое значение')
elif buffer.isalpha() or (buffer.isalnum() and not buffer.isdigit()):
raise ListDataError('Вы пытаетесь записать в список строку')
elif buffer.isdecimal():
my_list.append(int(buffer))
elif is_float(buffer):
my_list.append(float(buffer))
except ListDataError as e:
print(f'Возникли проблемы с элементом списка: {str(e)}')
pass


105 changes: 105 additions & 0 deletions lesson_8/hw04_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. А также класс «Оргтехника»,
# который будет базовым для классов-наследников. Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс).
# В базовом классе определить параметры, общие для приведенных типов. В классах-наследниках реализовать параметры,
# уникальные для каждого типа оргтехники.


from abc import ABC


class OfficeEquipment(ABC):
__id: int
__price: float
__title: str
__status: str

@property
def id(self):
return self.__id

@id.setter
def id(self, value):
self.__id = value

@property
def price(self):
return self.__price

@price.setter
def price(self, value):
if value > 0:
self.__price = value

@property
def title(self):
return self.__title

@title.setter
def title(self, value):
self.__title = value

@property
def status(self):
return self.__status

@status.setter
def status(self, value):
self.__status = value

def __init__(self, id, title, price, status):
self.__id = id
self.__title = title
self.__price = price
self.__status = status


class Printer(OfficeEquipment):
__cartridge_status: str

@property
def cartridge_status(self):
return self.__cartridge_status

@cartridge_status.setter
def cartridge_status(self, value):
self.__cartridge_status = value

def __init__(self, id, title, price, status, cartridge_status):
super().__init__(id, title, price, status)
self.__cartridge_status = cartridge_status


class ScannerEquipment(OfficeEquipment):
__resource: int

@property
def resource(self):
return self.__resource

@resource.setter
def resource(self, value):
self.__resource = value

def __init__(self, id, title, price, status, resource):
super().__init__(id, title, price, status)
self.__resource = resource


class PhotoCopier(OfficeEquipment):
__print_mode: str

@property
def print_mode(self):
return self.__print_mode

@print_mode.setter
def print_mode(self, value):
self.__print_mode = value

def __init__(self, id, title, price, status, print_mode):
super().__init__(id, title, price, status)
self.__print_mode = print_mode


class WareHouse:
pass
43 changes: 43 additions & 0 deletions lesson_8/hw05_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Продолжить работу над первым заданием. Разработать методы, отвечающие за приём оргтехники на склад и передачу
# в определенное подразделение компании. Для хранения данных о наименовании и количестве единиц оргтехники,
# а также других данных, можно использовать любую подходящую структуру, например словарь.


import hw04_8 as backup


class WareHouse:
__counter = 1
__data_storage = {}

@property
def data_storage(self):
return self.__data_storage

def __add__(self, other: backup.OfficeEquipment):
record = {'id': other.id, 'title': other.title, 'price': other.price, 'status': other.status}
if isinstance(other, backup.Printer):
record.update({'cartridge_status': other.cartridge_status})
elif isinstance(other, backup.PhotoCopier):
record.update({'print_mode': other.print_mode})
elif isinstance(other, backup.ScannerEquipment):
record.update({'resource': other.resource})
self.__data_storage.update({self.__counter: record})
self.__counter += 1

def __init__(self):
self.data_storage.clear()


# проверяем, как это все работает
warehouse = WareHouse()
printer = backup.Printer(123, 'Принтер HP', 123, 'new', 'new')
scanner = backup.ScannerEquipment(124, 'Сканер', 10000, 'old', 78854)
photocopier = backup.PhotoCopier(125, 'Ксерокс', 5000, 'too_old', 'color')

warehouse + printer
warehouse + scanner
warehouse + photocopier

print(warehouse.data_storage)
print(1)
69 changes: 69 additions & 0 deletions lesson_8/hw06_8.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Продолжить работу над вторым заданием. Реализуйте механизм валидации вводимых пользователем данных.
# Например, для указания количества принтеров, отправленных на склад, нельзя использовать строковый тип данных.
# Подсказка: постарайтесь по возможности реализовать в проекте «Склад оргтехники» максимум возможностей,
# изученных на уроках по ООП.


import hw05_8 as backup5
import hw04_8 as backup4


def validator(message, data_type):
success = False
result = None
while not success:
buffer = input(f'{message}\n')
if data_type == 'int':
try:
result = int(buffer)
success = True
except ValueError:
print('Неверный формат данных, попробуйте еще раз:')
elif data_type == 'float':
try:
result = float(buffer.replace(',', '.'))
success = True
except ValueError:
print('Неверный формат данных, попробуйте еще раз')
return result


warehouse_new = backup5.WareHouse()
print(f'Состояние склада на начало:\n{warehouse_new.data_storage}')

buffer = None
while buffer != '':
try:
buffer = input('Выберите тип оборудования:\nПринтер -- 1\nСканер -- 2\nФотокопир -- 3\n')
creation_mode = int(buffer)

id = validator('Введите id оборудования', 'int')
title = input('Введите название оборудования\n')
price = validator('Введите цену оборудования', 'float')
status = input('Введите статус оборудования\n')
equipment = None

if creation_mode == 1:
cartridge_status = input('Введите описание состояния картриджа оборудования\n')
equipment = backup4.Printer(id, title, price, status, cartridge_status)
# print(f'Блок создания принтера, склад: {warehouse.data_storage}')
warehouse_new + equipment
# print(f'Блок создания принтера, склад: {warehouse.data_storage}')
elif creation_mode == 2:
resource = validator('Введите оставшийся ресурс оборудования в листах\n', 'int')
equipment = backup4.ScannerEquipment(id, title, price, status, resource)
warehouse_new + equipment
elif creation_mode == 3:
print_mode = input('Введите описание режима печати оборудования\n')
equipment = backup4.PhotoCopier(id, title, price, status, print_mode)
warehouse_new + equipment

print(f'Текущее состояние склада:\n{warehouse_new.data_storage}')
buffer = input('Желаете создать еще один экземпляр оборудования? Введите "Да", если желаете. '
'Если нет, отправьте пустую строку\n')
except ValueError:
print(f'buffer -- "{buffer}"')
if buffer == '':
print('Программа завершает работу. Хорошего дня!')
else:
print('Проверьте вводимое значение и попробуйте еще разок создать оборудование')
Loading