diff --git a/homeworks/les06/task01.py b/homeworks/les06/task01.py new file mode 100644 index 0000000..e98b505 --- /dev/null +++ b/homeworks/les06/task01.py @@ -0,0 +1,58 @@ +""" +1. Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) и метод running (запуск). +Атрибут реализовать как приватный. В рамках метода реализовать переключение светофора в режимы: +красный, желтый, зеленый. +Продолжительность первого состояния (красный) составляет 7 секунд, второго (желтый) — 2 секунды, + третьего (зеленый) — на ваше усмотрение. + Переключение между режимами должно осуществляться только в указанном порядке (красный, желтый, зеленый). + Проверить работу примера, создав экземпляр и вызвав описанный метод. + +Задачу можно усложнить, реализовав проверку порядка режимов, и при его нарушении выводить соответствующее сообщение и +завершать скрипт. +""" +from time import sleep + + +class TrafficLight: + # контрольный автомат состояний + chain_states = {'красный': 'желтый', 'желтый': 'зеленый', 'зеленый': 'красный'} + chain_prev = '' + + def __init__(self): + self.__color = '' + + def _check_color(self, color): + is_good = False + if self.chain_prev == '': + is_good = True + else: + # контроль перехода состояний + is_good = (color == self.chain_states[self.chain_prev]) + return is_good + + def _run(self, color, time): + if not self._check_color(color): + print(f'Неправильная последовательность переключения {self.chain_prev}->{color}') + return False + self.chain_prev = color + self.__color = color + self._shine(time) + return True + + def _shine(self, time): + print(self.__color, end='') + for _ in range(time): + sleep(1) + print('.', end='') # иммитация периода действия цвета + print('') + + def running(self): + for color, time in [('красный', 7), ('желтый', 2), ('зеленый', 5), ('зеленый', 5)]: + if not self._run(color, time): + print('Установлена неправильная последовательность') + break + + +if __name__ == '__main__': + light_1 = TrafficLight() + light_1.running() diff --git a/homeworks/les06/task02.py b/homeworks/les06/task02.py new file mode 100644 index 0000000..67715cb --- /dev/null +++ b/homeworks/les06/task02.py @@ -0,0 +1,24 @@ +""" +2. Реализовать класс Road (дорога), в котором определить атрибуты: length (длина), width (ширина). +Значения данных атрибутов должны передаваться при создании экземпляра класса. +Атрибуты сделать защищенными. Определить метод расчета массы асфальта, необходимого для покрытия всего дорожного полотна. +Использовать формулу: длина * ширина * масса асфальта для покрытия одного кв метра дороги асфальтом, +толщиной в 1 см * чи сло см толщины полотна. Проверить работу метода. +Например: 20м * 5000м * 25кг * 5см = 12500 т +""" + + +class Road: + _mass_asphalt_m2 = 25 + + def __init__(self, length, width): + self._length = length + self._width = width + + def mass_asphalt(self, depth=1): + return self._length * self._width * self._mass_asphalt_m2 * depth + + +if __name__ == '__main__': + near_road = Road(1000, 24) + print('Масса асфальта', near_road.mass_asphalt(8)) diff --git a/homeworks/les06/task03.json b/homeworks/les06/task03.json new file mode 100644 index 0000000..566c364 --- /dev/null +++ b/homeworks/les06/task03.json @@ -0,0 +1,702 @@ +[ + { + "name": "Xander", + "surname": "Gibson", + "position": "ullamcorper.", + "wage": 23411, + "bonus": 4949 + }, + { + "name": "Chaney", + "surname": "Petersen", + "position": "dictum", + "wage": 38224, + "bonus": 1873 + }, + { + "name": "Russell", + "surname": "Carney", + "position": "leo.", + "wage": 22922, + "bonus": 2580 + }, + { + "name": "Akeem", + "surname": "Duncan", + "position": "elit", + "wage": 46717, + "bonus": 2376 + }, + { + "name": "Oren", + "surname": "Chase", + "position": "eget", + "wage": 27353, + "bonus": 1766 + }, + { + "name": "Stuart", + "surname": "Palmer", + "position": "est.", + "wage": 34114, + "bonus": 1174 + }, + { + "name": "Sylvester", + "surname": "Velazquez", + "position": "Nullam", + "wage": 31412, + "bonus": 4328 + }, + { + "name": "Caleb", + "surname": "Bryant", + "position": "augue.", + "wage": 25348, + "bonus": 4741 + }, + { + "name": "Igor", + "surname": "Greene", + "position": "metus", + "wage": 39917, + "bonus": 4262 + }, + { + "name": "Wallace", + "surname": "Holcomb", + "position": "habitant", + "wage": 32996, + "bonus": 4602 + }, + { + "name": "Lucius", + "surname": "Holman", + "position": "Cras", + "wage": 44048, + "bonus": 3762 + }, + { + "name": "Laith", + "surname": "Carey", + "position": "malesuada", + "wage": 29871, + "bonus": 4954 + }, + { + "name": "Lee", + "surname": "Terrell", + "position": "cursus", + "wage": 32074, + "bonus": 1503 + }, + { + "name": "Gary", + "surname": "Cherry", + "position": "Curabitur", + "wage": 20366, + "bonus": 1462 + }, + { + "name": "Marvin", + "surname": "Martin", + "position": "nunc.", + "wage": 49151, + "bonus": 1761 + }, + { + "name": "Shad", + "surname": "Spears", + "position": "quis", + "wage": 23122, + "bonus": 4712 + }, + { + "name": "Simon", + "surname": "Taylor", + "position": "ante", + "wage": 30134, + "bonus": 1236 + }, + { + "name": "Jason", + "surname": "Welch", + "position": "nunc", + "wage": 40806, + "bonus": 3582 + }, + { + "name": "Paki", + "surname": "Shepherd", + "position": "consectetuer", + "wage": 20221, + "bonus": 4000 + }, + { + "name": "Moses", + "surname": "Mccarthy", + "position": "aptent", + "wage": 49211, + "bonus": 3383 + }, + { + "name": "Harlan", + "surname": "Alvarado", + "position": "Aenean", + "wage": 23286, + "bonus": 3471 + }, + { + "name": "Travis", + "surname": "Mclean", + "position": "Mauris", + "wage": 33811, + "bonus": 1075 + }, + { + "name": "Sean", + "surname": "Mann", + "position": "elit", + "wage": 20026, + "bonus": 1198 + }, + { + "name": "Allistair", + "surname": "Barker", + "position": "auctor", + "wage": 37356, + "bonus": 1832 + }, + { + "name": "Warren", + "surname": "Wilkinson", + "position": "porttitor", + "wage": 27138, + "bonus": 1630 + }, + { + "name": "Mason", + "surname": "Hester", + "position": "tristique", + "wage": 39485, + "bonus": 2863 + }, + { + "name": "Colby", + "surname": "Richards", + "position": "erat", + "wage": 24275, + "bonus": 4331 + }, + { + "name": "Addison", + "surname": "Mccall", + "position": "nec", + "wage": 48428, + "bonus": 1024 + }, + { + "name": "Paki", + "surname": "Meyers", + "position": "vel,", + "wage": 49532, + "bonus": 4899 + }, + { + "name": "Gregory", + "surname": "Puckett", + "position": "lacinia", + "wage": 20790, + "bonus": 3320 + }, + { + "name": "Daniel", + "surname": "Le", + "position": "Nam", + "wage": 30739, + "bonus": 4040 + }, + { + "name": "Aristotle", + "surname": "Lynch", + "position": "aliquet.", + "wage": 25333, + "bonus": 4054 + }, + { + "name": "Fletcher", + "surname": "House", + "position": "sed,", + "wage": 36625, + "bonus": 3557 + }, + { + "name": "Eagan", + "surname": "Vega", + "position": "in", + "wage": 37108, + "bonus": 1347 + }, + { + "name": "Brian", + "surname": "Ramsey", + "position": "Cras", + "wage": 24900, + "bonus": 3020 + }, + { + "name": "Richard", + "surname": "Cote", + "position": "Cras", + "wage": 31882, + "bonus": 1012 + }, + { + "name": "Berk", + "surname": "Salas", + "position": "euismod", + "wage": 26359, + "bonus": 3724 + }, + { + "name": "Ross", + "surname": "Nelson", + "position": "commodo", + "wage": 34396, + "bonus": 1611 + }, + { + "name": "Jarrod", + "surname": "Cooke", + "position": "sem.", + "wage": 43558, + "bonus": 4062 + }, + { + "name": "Vladimir", + "surname": "Clements", + "position": "Nunc", + "wage": 20397, + "bonus": 1151 + }, + { + "name": "Lee", + "surname": "Faulkner", + "position": "volutpat", + "wage": 48485, + "bonus": 3059 + }, + { + "name": "Quentin", + "surname": "Sargent", + "position": "risus", + "wage": 29821, + "bonus": 2833 + }, + { + "name": "Adam", + "surname": "Parks", + "position": "nec,", + "wage": 32843, + "bonus": 3179 + }, + { + "name": "Colorado", + "surname": "Le", + "position": "magna", + "wage": 44055, + "bonus": 3112 + }, + { + "name": "Warren", + "surname": "Mack", + "position": "aliquet", + "wage": 42168, + "bonus": 1671 + }, + { + "name": "Austin", + "surname": "Joyner", + "position": "imperdiet,", + "wage": 43809, + "bonus": 4776 + }, + { + "name": "Kenneth", + "surname": "Houston", + "position": "Donec", + "wage": 32272, + "bonus": 2001 + }, + { + "name": "Cain", + "surname": "Mays", + "position": "semper", + "wage": 28026, + "bonus": 2221 + }, + { + "name": "Lucius", + "surname": "Cardenas", + "position": "et", + "wage": 39159, + "bonus": 3238 + }, + { + "name": "Demetrius", + "surname": "Holloway", + "position": "dui", + "wage": 22251, + "bonus": 2065 + }, + { + "name": "Oren", + "surname": "Valencia", + "position": "Pellentesque", + "wage": 48121, + "bonus": 1383 + }, + { + "name": "Tyler", + "surname": "Faulkner", + "position": "id", + "wage": 22626, + "bonus": 2247 + }, + { + "name": "Chaney", + "surname": "Hawkins", + "position": "dolor,", + "wage": 24208, + "bonus": 3981 + }, + { + "name": "Allen", + "surname": "Cole", + "position": "sit", + "wage": 49484, + "bonus": 2352 + }, + { + "name": "Silas", + "surname": "Franks", + "position": "ultricies", + "wage": 20737, + "bonus": 2385 + }, + { + "name": "Yuli", + "surname": "Rodriguez", + "position": "rhoncus.", + "wage": 44356, + "bonus": 3677 + }, + { + "name": "Xanthus", + "surname": "Kelly", + "position": "ipsum.", + "wage": 49414, + "bonus": 3775 + }, + { + "name": "Vaughan", + "surname": "Jacobson", + "position": "diam", + "wage": 41200, + "bonus": 3073 + }, + { + "name": "Martin", + "surname": "Hicks", + "position": "eu", + "wage": 24923, + "bonus": 4144 + }, + { + "name": "Reuben", + "surname": "Valentine", + "position": "non,", + "wage": 43866, + "bonus": 2511 + }, + { + "name": "Christian", + "surname": "Vaughan", + "position": "conubia", + "wage": 21683, + "bonus": 3141 + }, + { + "name": "Acton", + "surname": "Farrell", + "position": "scelerisque", + "wage": 48889, + "bonus": 1631 + }, + { + "name": "Otto", + "surname": "Hubbard", + "position": "turpis.", + "wage": 32866, + "bonus": 4140 + }, + { + "name": "Hasad", + "surname": "Adkins", + "position": "nunc", + "wage": 46841, + "bonus": 2126 + }, + { + "name": "Joshua", + "surname": "Briggs", + "position": "nibh.", + "wage": 31601, + "bonus": 4495 + }, + { + "name": "Ferdinand", + "surname": "Sharp", + "position": "erat,", + "wage": 22472, + "bonus": 1892 + }, + { + "name": "Chaney", + "surname": "Jefferson", + "position": "auctor", + "wage": 31303, + "bonus": 1893 + }, + { + "name": "Amery", + "surname": "Carey", + "position": "nonummy", + "wage": 21176, + "bonus": 2712 + }, + { + "name": "Ciaran", + "surname": "Cline", + "position": "tristique", + "wage": 47983, + "bonus": 2459 + }, + { + "name": "Beck", + "surname": "Chase", + "position": "Aliquam", + "wage": 33224, + "bonus": 2059 + }, + { + "name": "Thane", + "surname": "Bradley", + "position": "ac", + "wage": 25712, + "bonus": 4981 + }, + { + "name": "Stewart", + "surname": "Guzman", + "position": "penatibus", + "wage": 42073, + "bonus": 3316 + }, + { + "name": "Keaton", + "surname": "Bauer", + "position": "nisl", + "wage": 32124, + "bonus": 3131 + }, + { + "name": "Garrett", + "surname": "Glenn", + "position": "elementum,", + "wage": 40994, + "bonus": 4851 + }, + { + "name": "Malcolm", + "surname": "Brown", + "position": "neque", + "wage": 32606, + "bonus": 4546 + }, + { + "name": "Lionel", + "surname": "Cain", + "position": "Donec", + "wage": 36190, + "bonus": 1969 + }, + { + "name": "Duncan", + "surname": "Hopkins", + "position": "Praesent", + "wage": 33829, + "bonus": 3677 + }, + { + "name": "Seth", + "surname": "Hubbard", + "position": "vel,", + "wage": 29174, + "bonus": 1876 + }, + { + "name": "Lucian", + "surname": "Frank", + "position": "ac", + "wage": 23202, + "bonus": 3687 + }, + { + "name": "Mannix", + "surname": "Morris", + "position": "eget", + "wage": 45886, + "bonus": 2318 + }, + { + "name": "Raphael", + "surname": "Mcclure", + "position": "vel,", + "wage": 37794, + "bonus": 3745 + }, + { + "name": "Isaiah", + "surname": "Kidd", + "position": "non", + "wage": 20861, + "bonus": 3911 + }, + { + "name": "Zahir", + "surname": "Velasquez", + "position": "aliquet", + "wage": 42983, + "bonus": 3777 + }, + { + "name": "Len", + "surname": "Jordan", + "position": "Morbi", + "wage": 29074, + "bonus": 1693 + }, + { + "name": "Lucas", + "surname": "Williams", + "position": "Nulla", + "wage": 45159, + "bonus": 2605 + }, + { + "name": "Aaron", + "surname": "Snow", + "position": "ipsum", + "wage": 46981, + "bonus": 1329 + }, + { + "name": "Armand", + "surname": "Hewitt", + "position": "a,", + "wage": 41054, + "bonus": 1388 + }, + { + "name": "Kermit", + "surname": "Cooley", + "position": "tempus,", + "wage": 22693, + "bonus": 4823 + }, + { + "name": "Steel", + "surname": "Gray", + "position": "Nullam", + "wage": 21602, + "bonus": 3308 + }, + { + "name": "Edan", + "surname": "Dyer", + "position": "Quisque", + "wage": 43433, + "bonus": 3305 + }, + { + "name": "Hasad", + "surname": "Espinoza", + "position": "nunc.", + "wage": 40902, + "bonus": 3053 + }, + { + "name": "Fritz", + "surname": "Wells", + "position": "vulputate,", + "wage": 22864, + "bonus": 3028 + }, + { + "name": "Neville", + "surname": "Landry", + "position": "sollicitudin", + "wage": 31576, + "bonus": 4884 + }, + { + "name": "Adam", + "surname": "Watkins", + "position": "egestas", + "wage": 47268, + "bonus": 1866 + }, + { + "name": "Magee", + "surname": "Andrews", + "position": "dictum", + "wage": 38618, + "bonus": 2290 + }, + { + "name": "Darius", + "surname": "Goodman", + "position": "ac,", + "wage": 41819, + "bonus": 2079 + }, + { + "name": "Troy", + "surname": "Carroll", + "position": "ante", + "wage": 36409, + "bonus": 2428 + }, + { + "name": "Chadwick", + "surname": "Duran", + "position": "sodales", + "wage": 31939, + "bonus": 3591 + }, + { + "name": "Dustin", + "surname": "Delaney", + "position": "ipsum.", + "wage": 48001, + "bonus": 4314 + }, + { + "name": "Abel", + "surname": "Shannon", + "position": "nulla.", + "wage": 36995, + "bonus": 4890 + } +] \ No newline at end of file diff --git a/homeworks/les06/task03.py b/homeworks/les06/task03.py new file mode 100644 index 0000000..8197d07 --- /dev/null +++ b/homeworks/les06/task03.py @@ -0,0 +1,43 @@ +""" +3. Реализовать базовый класс Worker (работник), в котором определить атрибуты: +name, surname, position (должность), income (доход). +Последний атрибут должен быть защищенным и ссылаться на словарь, содержащий элементы: оклад и премия, +например, {"wage": wage, "bonus": bonus}. +Создать класс Position (должность) на базе класса Worker. +В классе Position реализовать методы получения полного имени сотрудника (get_full_name) и +дохода с учетом премии (get_total_income). +Проверить работу примера на реальных данных (создать экземпляры класса Position, передать данные, +проверить значения атрибутов, вызвать методы экземпляров). + +""" + + +class Worker: + company = [] + _income = {"wage": 0, "bonus": 0} + + def __init__(self, name, surname, position, income: dict): + self.name = name + self.surname = surname + self.position = position + self._income = income + self.company.append(self) + + +class Position(Worker): + def get_full_name(self): + return f'{self.name} {self.surname}' + + def get_total_income(self): + return self._income['wage'] + self._income['bonus'] + + +if __name__ == '__main__': + Position('Xander', 'Gibson', 'General Director', {"wage": 38224, "bonus": 4949}) + Position('Chaney', 'Petersen', 'R&D Director ', {"wage": 23411, "bonus": 1873}) + Position('Russell', 'Carney', 'Programmer', {"wage": 22922, "bonus": 2580}) + Position('Oren', 'Chase', 'Programmer', {"wage": 27353, "bonus": 1766}) + Position('Stuart', 'Palmer', 'Data Scientist', {"wage": 34114, "bonus": 1174}) + + for employee in Worker.company: + print(f'{employee.get_full_name():15} {employee.position:17} {employee.get_total_income():5.2f}') diff --git a/homeworks/les06/task04.py b/homeworks/les06/task04.py new file mode 100644 index 0000000..c16892b --- /dev/null +++ b/homeworks/les06/task04.py @@ -0,0 +1,69 @@ +""" +4. Реализуйте базовый класс Car. +У данного класса должны быть следующие атрибуты: speed, color, name, is_police (булево). +А также методы: go, stop, turn(direction), которые должны сообщать, что машина поехала, остановилась, +повернула (куда). +Опишите несколько дочерних классов: TownCar, SportCar, WorkCar, PoliceCar. +Добавьте в базовый класс метод show_speed, который должен показывать текущую скорость автомобиля. +Для классов TownCar и WorkCar переопределите метод show_speed. +При значении скорости свыше 60 (TownCar) и 40 (WorkCar) должно выводиться сообщение о превышении +скорости. +Создайте экземпляры классов, передайте значения атрибутов. Выполните доступ к атрибутам, +выведите результат. Выполните вызов методов и также покажите результат. +""" + + +class Car: + def __init__(self, speed: int, color: str, name: str): + self.speed = speed + self.color = color + self.name = name + + def go(self): + print('Вперед') + + def stop(self): + print('Стоп') + + def turn(self, side): + print(side) + + def show_speed(self): + print(f'Скорость : {self.speed}') + + +class TownCar(Car): + def show_speed(self): + super().show_speed() + if self.speed > 60: + print(f"Превышена скорость на {self.speed - 60}") + + +class SportCar(Car): + pass + + +class WorkCar(Car): + def show_speed(self): + super().show_speed() + if self.speed > 40: + print(f"Превышена скорость на {self.speed - 40}") + + +class PoliceCar(Car): + def __init__(self, speed: int, color: str, name: str): + super().__init__(speed, color, name) + self.is_police = True + + +if __name__ == '__main__': + + for car in [TownCar(55, 'красная', 'Toyota'), SportCar(80, 'белая', 'Nissan'), WorkCar(50, 'коричневая', 'Ford'), + PoliceCar(90, 'синяя', 'Ford')]: + print('--- машина') + print(car.name, car.color, car.speed) + car.show_speed() + car.go() + car.turn('налево') + car.stop() + diff --git a/homeworks/les06/task05.py b/homeworks/les06/task05.py new file mode 100644 index 0000000..b81e82e --- /dev/null +++ b/homeworks/les06/task05.py @@ -0,0 +1,39 @@ +""" +5. Реализовать класс Stationery (канцелярская принадлежность). Определить в нем атрибут title (название) и метод +draw (отрисовка). Метод выводит сообщение “Запуск отрисовки.” Создать три дочерних класса Pen (ручка), +Pencil (карандаш), Handle (маркер). В каждом из классов реализовать переопределение метода draw. Для каждого из +классов методы должен выводить уникальное сообщение. Создать экземпляры классов и проверить, что выведет описанный +метод для каждого экземпляра. +""" + + +class Stationery: + def __init__(self, title): + self.title = title + + def draw(self): + print('Запуск отрисовки') + + +class Pen(Stationery): + def draw(self): + print(f'Ручка {self.title} пишет') + + +class Pencil(Stationery): + def draw(self): + print(f'Карандаш {self.title} рисует') + + +class Handle(Stationery): + def draw(self): + print(f'Маркер {self.title} помечает') + + +if __name__ == '__main__': + pen = Pen('Kaweco') + pen.draw() + pencil = Pencil('Koh-i-noor') + pencil.draw() + handle = Handle('Centropen') + handle.draw()