From 5a7194a01d138e5ac888536a6a8bb82907125aee Mon Sep 17 00:00:00 2001 From: Mikhalev V Date: Tue, 10 May 2022 13:51:24 +0300 Subject: [PATCH] Hometask 6 complete. Atention! Task 1 has a 2 realization. --- lesson_6/hometask/task_1.py | 43 +++++++++++ lesson_6/hometask/task_1_another.py | 62 ++++++++++++++++ lesson_6/hometask/task_2.py | 47 ++++++++++++ lesson_6/hometask/task_3.py | 56 +++++++++++++++ lesson_6/hometask/task_4.py | 108 ++++++++++++++++++++++++++++ lesson_6/hometask/task_5.py | 48 +++++++++++++ 6 files changed, 364 insertions(+) create mode 100644 lesson_6/hometask/task_1.py create mode 100644 lesson_6/hometask/task_1_another.py create mode 100644 lesson_6/hometask/task_2.py create mode 100644 lesson_6/hometask/task_3.py create mode 100644 lesson_6/hometask/task_4.py create mode 100644 lesson_6/hometask/task_5.py diff --git a/lesson_6/hometask/task_1.py b/lesson_6/hometask/task_1.py new file mode 100644 index 0000000..89d151d --- /dev/null +++ b/lesson_6/hometask/task_1.py @@ -0,0 +1,43 @@ +# Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) +# и метод running (запуск). Атрибут реализовать как приватный. +# В рамках метода реализовать переключение светофора в режимы: +# красный, желтый, зеленый. +# Продолжительность первого состояния (красный) составляет 7 секунд, +# второго (желтый) — 2 секунды, третьего (зеленый) — на ваше усмотрение. +# Переключение между режимами должно осуществляться только в указанном порядке +# (красный, желтый, зеленый). +# Проверить работу примера, создав экземпляр и вызвав описанный метод. +# +# Задачу можно усложнить, реализовав проверку порядка режимов, +# и при его нарушении выводить соответствующее сообщение и завершать скрипт. + +# Задание абстрактное, конечно) +# Переключение между всеми режимами автоматически или пользователь задаёт текущий режим??? +# Если автоматически, то какого типа проверка и зачем она в принципе? +# Если пользователь задаёт текущий режим, то проверка нужна. Но зачем задержки?) И какой тогда это светофор? +# Нужен ли бесконечный цикл? Или цикл, прерывающийся по какому-либо условию? По какому условию? +# Разве не зелёный, желтый, красный?? + +import time + + +class TrafficLight: + __color: str + + def running(self): + self.__color = "red" + print(self.__color) + time.sleep(7) + self.__color = "yellow" + print(self.__color) + time.sleep(2) + self.__color = "green" + print(self.__color) + time.sleep(4) + + +if __name__ == "__main__": + obj = TrafficLight() + obj.running() + obj.running() + print("Thats all!") diff --git a/lesson_6/hometask/task_1_another.py b/lesson_6/hometask/task_1_another.py new file mode 100644 index 0000000..181ea0b --- /dev/null +++ b/lesson_6/hometask/task_1_another.py @@ -0,0 +1,62 @@ +# Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) +# и метод running (запуск). Атрибут реализовать как приватный. +# В рамках метода реализовать переключение светофора в режимы: +# красный, желтый, зеленый. +# Продолжительность первого состояния (красный) составляет 7 секунд, +# второго (желтый) — 2 секунды, третьего (зеленый) — на ваше усмотрение. +# Переключение между режимами должно осуществляться только в указанном порядке +# (красный, желтый, зеленый). +# Проверить работу примера, создав экземпляр и вызвав описанный метод. +# +# Задачу можно усложнить, реализовав проверку порядка режимов, +# и при его нарушении выводить соответствующее сообщение и завершать скрипт. + +# Задание абстрактное, конечно) +# Переключение между всеми режимами автоматически или пользователь задаёт текущий режим??? +# Если автоматически, то какого типа проверка и зачем она в принципе? +# Если пользователь задаёт текущий режим, то проверка нужна. Но зачем задержки?) И какой тогда это светофор? +# Нужен ли бесконечный цикл? Или цикл, прерывающийся по какому-либо условию? По какому условию? +# Разве не зелёный, желтый, красный?? + +import time +from itertools import cycle as it_tools_cycle + +traffic_modes = ('red', 'yellow', 'green') + + +class TrafficLight: + __color = "" + __traffic_modes_order = dict(zip(traffic_modes, [x for x in range(1, len(traffic_modes) + 1)])) + __traffic_modes_duration = dict(zip(traffic_modes, (7, 2, 4))) + + # проверка правильности последовательности + # ... -> red -> yellow -> green -> red -> yellow -> green -> red -> ... + # лучше через def. Хотя лямбда быстрее. Ну и мне интересно попробовать именно так) + check_order = lambda current, previous: (current - previous) % 3 == 1 + + def running(self, mode: str): + if mode not in traffic_modes: + raise ValueError("Unexpected traffic mode") + if not self.__color: + self.__color = mode + elif not TrafficLight.check_order(self.__traffic_modes_order[mode], + self.__traffic_modes_order[self.__color]): + string = f"Uncorrect traffic mode order! Previous {self.__color}, you need {mode}" + raise ValueError(string) + self.__color = mode + print(self.__color) + time.sleep(self.__traffic_modes_duration[self.__color]) + + +if __name__ == "__main__": + obj = TrafficLight() + my_max_count = 2 + obj.running("green") + mode_gen = it_tools_cycle(traffic_modes) + for count in range(my_max_count*len(traffic_modes)): + obj.running(mode_gen.__next__()) + obj.running("red") + obj.running("yellow") + # а тут порядок нарущен! + obj.running("red") + print("Thats all!") diff --git a/lesson_6/hometask/task_2.py b/lesson_6/hometask/task_2.py new file mode 100644 index 0000000..374c358 --- /dev/null +++ b/lesson_6/hometask/task_2.py @@ -0,0 +1,47 @@ +# Реализовать класс Road (дорога), в котором определить атрибуты: +# length (длина), width (ширина). +# Значения данных атрибутов должны передаваться при создании экземпляра класса. +# Атрибуты сделать защищенными. Определить метод расчета массы асфальта, +# необходимого для покрытия всего дорожного полотна. +# Использовать формулу: длина`*`ширина`*`масса асфальта для покрытия одного кв метра дороги асфальтом, +# толщиной в 1 см`*`число см толщины полотна. +# Проверить работу метода. +# +# **Например:** 20м`*`5000м`*`25кг`*`5см = 12500 т + +class Road: + _length: float + _width: float + + def __init__(self, length: float, width: float): + self._length = length if length > 0.0 else 0.0 + self._width = width if width > 0.0 else 0.0 + + def get_asphalt_mass(self, thickness: float = 5.0, mass_per_sm_sq_m: float = 25.0): + """ + Расчета массы асфальта, необходимого для покрытия всего дорожного полотна + + :param thickness: толщина полотна, см + :param mass_per_sm_sq_m: масса асфальта для покрытия одного кв метра + дороги асфальтом, толщиной в 1 см, кг/м**2*см + :return: массы асфальта, необходимого для покрытия всего дорожного полотна, кг + """ + return self._length * self._width * thickness * mass_per_sm_sq_m + + +if __name__ == "__main__": + universe_result_str = "Требуемая масса асфальта для толщины {thick} см и " \ + "массы {mass_per_vol} кг/м**2*см равна {mass} кг" + current_road = Road(length=float(input("Длина дороги >>>")), + width=float(input("Ширина дороги >>>"))) + thickness = float(input("Толщина дороги >>>")) + # масса асфальта для покрытия одного кв метра +- стандартизирована + print(universe_result_str.format(thick=thickness, + mass_per_vol=25, + mass=current_road.get_asphalt_mass(thickness))) + thickness = float(input("Толщина дороги >>>")) + mass_per_volume = float(input("Масса асфальта для покрытия одного кв метра " + "дороги асфальтом, толщиной в 1 см >>>")) + print(universe_result_str.format(thick=thickness, + mass_per_vol=mass_per_volume, + mass=current_road.get_asphalt_mass(thickness))) \ No newline at end of file diff --git a/lesson_6/hometask/task_3.py b/lesson_6/hometask/task_3.py new file mode 100644 index 0000000..9c39800 --- /dev/null +++ b/lesson_6/hometask/task_3.py @@ -0,0 +1,56 @@ +# Реализовать базовый класс Worker (работник), +# в котором определить атрибуты: +# name, surname, position (должность), income (доход). +# Последний атрибут должен быть защищенным и ссылаться на словарь, +# содержащий элементы: оклад и премия, например, {"wage": wage, "bonus": bonus}. +# Создать класс Position (должность) на базе класса Worker. +# В классе Position реализовать методы получения полного имени сотрудника (get_full_name) +# и дохода с учетом премии (get_total_income). +# Проверить работу примера на реальных данных +# (создать экземпляры класса Position, передать данные, +# проверить значения атрибутов, вызвать методы экземпляров). + +class Worker: + name: str + surname: str + position: str + _income = {"wage": float, "bonus": float} + + def __init__(self, name, surname): + self.name, self.surname = name, surname + + def set_income(self, wage: float, bonus: float = 0.0): + """ + Метод расчёта полной заработной платы. + Оклад не может быть отрицательным. + А вот премия может быть штрафом! + + :param wage: оклад + :param bonus: премия или штраф + :return: полная заработная плата + """ + self._income["wage"], self._income["bonus"] = wage if wage >= 0.0 else 0.0, bonus + + +class Position(Worker): + def __init__(self, name: str, surname: str, position: str): + super().__init__(name, surname) + self.position = position + + def get_full_name(self): + return f"{self.name} {self.surname}" + + def get_total_income(self): + if (type(self._income["wage"]) is type) or (self._income["bonus"] is type): + raise ValueError("wage and bonus are not setted!") + return self._income["wage"] + self._income["bonus"] + + +if __name__ == "__main__": + *drudge_name, drudge_surname = input("Enter person name, surname >>> ").split() + drudge_name = " ".join(drudge_name) + drudge = Position(name=drudge_name, surname=drudge_surname, position=input("Input position title >>>")) + wage = float(input(f"Enter the {drudge.position} wage >>> ")) + bonus = float(input(f"Enter the {drudge.position} bonus >>> ")) + drudge.set_income(float(wage), float(bonus)) + print(f"{drudge.get_full_name()} is {drudge.position} with salary {drudge.get_total_income()}.") diff --git a/lesson_6/hometask/task_4.py b/lesson_6/hometask/task_4.py new file mode 100644 index 0000000..89b6ef6 --- /dev/null +++ b/lesson_6/hometask/task_4.py @@ -0,0 +1,108 @@ +# Реализуйте базовый класс Car. +# У данного класса должны быть следующие атрибуты: +# speed, color, name, is_police (булево). +# А также методы: go, stop, turn(direction), +# которые должны сообщать, что машина поехала, остановилась, повернула (куда). +# Опишите несколько дочерних классов: +# TownCar, SportCar, WorkCar, PoliceCar. +# Добавьте в базовый класс метод show_speed, +# который должен показывать текущую скорость автомобиля. +# Для классов TownCar и WorkCar переопределите метод show_speed. +# При значении скорости свыше 60 (TownCar) и 40 (WorkCar) +# должно выводиться сообщение о превышении скорости. +# Создайте экземпляры классов, передайте значения атрибутов. +# Выполните доступ к атрибутам, выведите результат. +# Выполните вызов методов и также покажите результат. + +turn_turple = ("налево", "направо", "назад") + + +class Car: + speed: float + color: str + name: str = "" + is_police: bool = False + + def go(self) -> str: + return f"Машина {self.name} поехала" + + def stop(self) -> str: + # можно добавить time.sleep со временем, соответствующем тормозному пути + self.speed = 0.0 + return f"Машина {self.name} остановилась" + + def turn(self, direction: str) -> str: + if direction in turn_turple: + return f"Машина {self.name} повернула {direction}" + else: + return f"Манёвр {direction} недоступен, машина {self.name} движется без изменений" + + def show_speed(self) -> str: + return f"Текущая скорость {self.name} {self.speed} км/ч" + + def get_car_type_info(self) -> str: + return f'{self.color} {self.name} is {"" if self.is_police else "not "}a police car' + + +class TownCar(Car): + _extra_speed = 60 + + def show_speed(self) -> str: + if self.speed > self._extra_speed: + return f"{super().show_speed()} превышает лимит в {self._extra_speed} км/ч!" + else: + # согласно документации, в данном контексте == super() + return super(TownCar, self).show_speed() + + +class SportCar(Car): + pass + + +class WorkCar(Car): + _extra_speed = 40 + + def show_speed(self) -> str: + if self.speed > self._extra_speed: + return f"{super().show_speed()} км/ч превышает лимит в {self._extra_speed} км/ч!" + else: + return super(WorkCar, self).show_speed() + + +class PoliceCar(Car): + def __init__(self): + self.is_police = True + super().__init__() + + +if __name__ == "__main__": + city_car = TownCar() + speedy_car = SportCar() + drudge_car = WorkCar() + cop_car = PoliceCar() + + city_car.name = "Toyota" + speedy_car.name = "Porsche" + drudge_car.name = "Renault" + cop_car.name = "Dodge" + + city_car.speed = 70.0 + drudge_car.speed = 40.0 + speedy_car.speed = 100.0 + speedy_car.color = "Red" + city_car.color = "Orange" + drudge_car.color = "White" + cop_car.color = "Police colored" + + print(city_car.get_car_type_info()) + print(drudge_car.get_car_type_info()) + print(speedy_car.get_car_type_info()) + print(cop_car.get_car_type_info()) + + print(drudge_car.show_speed()) + print(cop_car.go()) + print(speedy_car.show_speed()) + print(speedy_car.stop()) + print(speedy_car.show_speed()) + print(city_car.turn("налево")) + print(cop_car.turn("напрямо")) diff --git a/lesson_6/hometask/task_5.py b/lesson_6/hometask/task_5.py new file mode 100644 index 0000000..b018fe2 --- /dev/null +++ b/lesson_6/hometask/task_5.py @@ -0,0 +1,48 @@ +# Реализовать класс Stationery (канцелярская принадлежность). +# Определить в нем атрибут title (название) и метод draw (отрисовка). +# Метод выводит сообщение “Запуск отрисовки.” +# Создать три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер). +# В каждом из классов реализовать переопределение метода draw. +# Для каждого из классов метод должен выводить уникальное сообщение. +# Создать экземпляры классов и проверить, что выведет описанный метод для каждого экземпляра. + +class Stationery: + _title: str + + def draw(self): + return "Запуск отрисовки." + + +class Pen(Stationery): + def __init__(self): + self._title = "Ручка" + + def draw(self): + return f"{super().draw()} {self._title} используется для отрисовки." + + +class Pencil(Stationery): + def __init__(self): + self._title = "Карандаш" + + def draw(self): + return f"{super().draw()} {self._title} используется для отрисовки." + + +class Handle(Stationery): + def __init__(self): + self._title = "Маркер" + + def draw(self): + return f"{super().draw()} {self._title} используется для отрисовки." + + +if __name__ == "__main__": + something = Stationery() + pen = Pen() + pencil = Pencil() + handle = Handle() + print(something.draw()) + print(pen.draw()) + print(pencil.draw()) + print(handle.draw())