|
@@ -0,0 +1,379 @@
|
|
|
+# Наследование. Делегирование Delegating.
|
|
|
+
|
|
|
+from functools import total_ordering
|
|
|
+
|
|
|
+class Person:
|
|
|
+
|
|
|
+ def __init__(self, name, surname) -> None:
|
|
|
+ self.name = name
|
|
|
+ self.surname = surname
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Person {self.name} {self.surname}"
|
|
|
+
|
|
|
+ def info(self):
|
|
|
+ print("Parent class")
|
|
|
+ print(self)
|
|
|
+
|
|
|
+ def breath(self):
|
|
|
+ print('Человек дышит')
|
|
|
+
|
|
|
+
|
|
|
+class Doctor(Person):
|
|
|
+
|
|
|
+ def __init__(self, name, surname, age):
|
|
|
+ super().__init__(name, surname)
|
|
|
+ self.age = age
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Doctor {self.name} {self.surname}"
|
|
|
+
|
|
|
+ def breath(self):
|
|
|
+ super().breath()
|
|
|
+ print("Доктор дышит")
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class Rectangle:
|
|
|
+
|
|
|
+ def __init__(self, length, width):
|
|
|
+ self.length = length
|
|
|
+ self.width = width
|
|
|
+
|
|
|
+ def area(self):
|
|
|
+ return self.length * self.width
|
|
|
+
|
|
|
+ def perimeter(self):
|
|
|
+ return 2 * self.length + 2 * self.width
|
|
|
+
|
|
|
+
|
|
|
+class Square(Rectangle):
|
|
|
+
|
|
|
+ def __init__(self, side):
|
|
|
+ super().__init__(side, side)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class Person:
|
|
|
+
|
|
|
+ def __init__(self, name, passport):
|
|
|
+ self.name = name
|
|
|
+ self.passport = passport
|
|
|
+
|
|
|
+ def display(self):
|
|
|
+ print(f"{self.name}: {self.passport}")
|
|
|
+
|
|
|
+
|
|
|
+class Employee(Person):
|
|
|
+
|
|
|
+ def __init__(self, name, passport, salary, department):
|
|
|
+ super().__init__(name, passport)
|
|
|
+ self.salary = salary
|
|
|
+ self.department = department
|
|
|
+
|
|
|
+
|
|
|
+class Vehicle:
|
|
|
+
|
|
|
+ def __init__(self, name, mileage, capacity):
|
|
|
+ self.name = name
|
|
|
+ self.mileage = mileage
|
|
|
+ self.capacity = capacity
|
|
|
+
|
|
|
+ def fare(self):
|
|
|
+ return self.capacity * 100
|
|
|
+
|
|
|
+ def display(self):
|
|
|
+ print(f"Total {self.name} fare is: {self.fare()}")
|
|
|
+
|
|
|
+
|
|
|
+class Bus(Vehicle):
|
|
|
+
|
|
|
+ def __init__(self, name, mileage):
|
|
|
+ super().__init__(name, mileage, 50)
|
|
|
+
|
|
|
+ def fare(self):
|
|
|
+ return super().fare() * 1.1
|
|
|
+
|
|
|
+
|
|
|
+class Taxi(Vehicle):
|
|
|
+
|
|
|
+ def __init__(self, name, mileage):
|
|
|
+ super().__init__(name, mileage, 4)
|
|
|
+
|
|
|
+ def fare(self):
|
|
|
+ return super().fare() * 1.35
|
|
|
+
|
|
|
+
|
|
|
+class Transport:
|
|
|
+
|
|
|
+ def __init__(self, brand, max_speed, kind=None):
|
|
|
+ self.brand = brand
|
|
|
+ self.max_speed = max_speed
|
|
|
+ self.kind = kind
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Тип транспорта {self.kind} марки {self.brand} может развить скорость {self.max_speed} км/ч"
|
|
|
+
|
|
|
+
|
|
|
+class Car(Transport):
|
|
|
+
|
|
|
+ def __init__(self, brand, max_speed, mileage, gasoline_residue):
|
|
|
+ super().__init__(brand, max_speed, kind='Car')
|
|
|
+ self.mileage = mileage
|
|
|
+ self.__gasoline_residue = gasoline_residue
|
|
|
+
|
|
|
+ @property
|
|
|
+ def gasoline(self):
|
|
|
+ return f"Осталось бензина {self.__gasoline_residue} л"
|
|
|
+
|
|
|
+ @gasoline.setter
|
|
|
+ def gasoline(self, value):
|
|
|
+ if not isinstance(value, int):
|
|
|
+ print('Ошибка заправки автомобиля')
|
|
|
+ else:
|
|
|
+ self.__gasoline_residue += value
|
|
|
+ print(f"Объем топлива увеличен на {value} л и составляет {self.__gasoline_residue} л")
|
|
|
+
|
|
|
+
|
|
|
+class Boat(Transport):
|
|
|
+
|
|
|
+ def __init__(self, brand, max_speed, owners_name):
|
|
|
+ super().__init__(brand, max_speed, kind='Boat')
|
|
|
+ self.owners_name = owners_name
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Этой лодкой марки {self.brand} владеет {self.owners_name}"
|
|
|
+
|
|
|
+
|
|
|
+class Plane(Transport):
|
|
|
+
|
|
|
+ def __init__(self, brand, max_speed, capacity):
|
|
|
+ super().__init__(brand, max_speed, kind='Plane')
|
|
|
+ self.capacity = capacity
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Самолет марки {self.brand} вмещает в себя {self.capacity} людей"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+class Initialization:
|
|
|
+
|
|
|
+ def __init__(self, capacity, food: list[str]):
|
|
|
+ if not isinstance(capacity, int):
|
|
|
+ print('Количество людей должно быть целым числом')
|
|
|
+ else:
|
|
|
+ self.capacity = capacity
|
|
|
+ self.food = food
|
|
|
+
|
|
|
+
|
|
|
+class Vegetarian(Initialization):
|
|
|
+
|
|
|
+ def __init__(self, capacity, food: list[str]):
|
|
|
+ super().__init__(capacity, food)
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"{self.capacity} людей предпочитают не есть мясо! Они предпочитают {self.food}"
|
|
|
+
|
|
|
+
|
|
|
+class MeatEater(Initialization):
|
|
|
+
|
|
|
+ def __init__(self, capacity, food: list[str]):
|
|
|
+ super().__init__(capacity, food)
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"{self.capacity} мясоедов в Москве! Помимо мяса они едят еще и {self.food}"
|
|
|
+
|
|
|
+@total_ordering
|
|
|
+class SweetTooth(Initialization):
|
|
|
+
|
|
|
+ def __init__(self, capacity, food: list[str]):
|
|
|
+ super().__init__(capacity, food)
|
|
|
+
|
|
|
+ def __str__(self):
|
|
|
+ return f"Сладкоежек в Москве {self.capacity}. Их самая любимая еда: {self.food}"
|
|
|
+
|
|
|
+ def __eq__(self, value):
|
|
|
+ if isinstance(value, int):
|
|
|
+ return self.capacity == value
|
|
|
+ elif isinstance(value, (Initialization)):
|
|
|
+ return self.capacity == value.capacity
|
|
|
+ else:
|
|
|
+ return f"Невозможно сравнить количество сладкоежек с {value}"
|
|
|
+
|
|
|
+ def __lt__(self, value):
|
|
|
+ if isinstance(value, int):
|
|
|
+ return self.capacity < value
|
|
|
+ elif isinstance(value, (Initialization)):
|
|
|
+ return self.capacity < value.capacity
|
|
|
+ else:
|
|
|
+ return f"Невозможно сравнить количество сладкоежек с {value}"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+
|
|
|
+ p1 = Initialization('Chuck', [])
|
|
|
+ assert isinstance(p1, Initialization)
|
|
|
+ assert not hasattr(p1, 'capacity'), 'Не нужно создавать атрибут "capacity", если передается не целое число'
|
|
|
+ assert not hasattr(p1, 'food'), 'Не нужно создавать атрибут "food", если передается не целое число'
|
|
|
+
|
|
|
+ c1 = Vegetarian(100, [1, 2, 3])
|
|
|
+ print(c1)
|
|
|
+ assert isinstance(c1, Vegetarian)
|
|
|
+ assert c1.capacity == 100
|
|
|
+ assert c1.food == [1, 2, 3]
|
|
|
+
|
|
|
+ b1 = MeatEater(1000, ['Arkasha'])
|
|
|
+ print(b1)
|
|
|
+ assert isinstance(b1, MeatEater)
|
|
|
+ assert b1.capacity == 1000
|
|
|
+ assert b1.food == ['Arkasha']
|
|
|
+
|
|
|
+ pla = SweetTooth(444, [2150, 777])
|
|
|
+ print(pla)
|
|
|
+ assert isinstance(pla, SweetTooth)
|
|
|
+ assert pla.capacity == 444
|
|
|
+ assert pla.food == [2150, 777]
|
|
|
+ assert pla > 100
|
|
|
+ assert not pla < 80
|
|
|
+ assert not pla == 90
|
|
|
+ assert pla > c1
|
|
|
+ assert not pla < c1
|
|
|
+ assert not pla == c1
|
|
|
+ assert not pla > b1
|
|
|
+ assert pla < b1
|
|
|
+ assert not pla == b1
|
|
|
+
|
|
|
+ v_first = Vegetarian(10000, ['Орехи', 'овощи', 'фрукты'])
|
|
|
+ print(v_first) # 10000 людей предпочитают не есть мясо! Они предпочитают ['Орехи', 'овощи', 'фрукты']
|
|
|
+ v_second = Vegetarian([23], ['nothing']) # Количество людей должно быть целым числом
|
|
|
+
|
|
|
+ m_first = MeatEater(15000, ['Жареную картошку', 'рыба'])
|
|
|
+ print(m_first) # 15000 мясоедов в Москве! Помимо мяса они едят еще и ['Жареную картошку', 'рыба']
|
|
|
+ s_first = SweetTooth(30000, ['Мороженое', 'Чипсы', 'ШОКОЛАД'])
|
|
|
+ print(s_first) # Сладкоежек в Москве 30000. Их самая любимая еда: ['Мороженое', 'Чипсы', 'ШОКОЛАД']
|
|
|
+ print(s_first > v_first) # Сладкоежек больше, чем людей с другим вкусовым предпочтением
|
|
|
+ print(30000 == s_first) # Количество сладкоежек из опрошенных людей совпадает с 30000
|
|
|
+ print(s_first == 25000) # Количество людей не совпадает
|
|
|
+ print(100000 < s_first) # Количество сладкоежек в Москве не больше, чем 100000
|
|
|
+ print(100 < s_first) # Количество сладкоежек больше, чем 100
|
|
|
+
|
|
|
+ '''
|
|
|
+ p1 = Transport('Chuck', 50)
|
|
|
+ print(p1)
|
|
|
+ assert isinstance(p1, Transport)
|
|
|
+ assert p1.kind == None
|
|
|
+ assert p1.brand == 'Chuck'
|
|
|
+ assert p1.max_speed == 50
|
|
|
+ assert p1.__dict__ == {'kind': None, 'brand': 'Chuck', 'max_speed': 50}
|
|
|
+
|
|
|
+ c1 = Car('RRR', 50, 150, 999)
|
|
|
+ print(c1)
|
|
|
+
|
|
|
+ assert isinstance(c1, Car)
|
|
|
+ assert c1.kind == "Car"
|
|
|
+ assert c1.brand == 'RRR'
|
|
|
+ assert c1.max_speed == 50
|
|
|
+ assert c1.mileage == 150
|
|
|
+ assert c1.gasoline == 'Осталось бензина 999 л'
|
|
|
+ c1.gasoline = 100
|
|
|
+ assert c1.gasoline == 'Осталось бензина 1099 л'
|
|
|
+ assert c1.__dict__ == {'kind': 'Car', 'brand': 'RRR', 'max_speed': 50,
|
|
|
+ 'mileage': 150, '_Car__gasoline_residue': 1099}
|
|
|
+
|
|
|
+ b1 = Boat('XXX', 1150, 'Arkasha')
|
|
|
+ print(b1)
|
|
|
+ assert isinstance(b1, Boat)
|
|
|
+ assert b1.kind == "Boat"
|
|
|
+ assert b1.brand == 'XXX'
|
|
|
+ assert b1.max_speed == 1150
|
|
|
+ assert b1.owners_name == 'Arkasha'
|
|
|
+
|
|
|
+ pla = Plane('www', 2150, 777)
|
|
|
+ print(pla)
|
|
|
+ assert isinstance(pla, Plane)
|
|
|
+ assert pla.kind == "Plane"
|
|
|
+ assert pla.brand == 'www'
|
|
|
+ assert pla.max_speed == 2150
|
|
|
+ assert pla.capacity == 777
|
|
|
+
|
|
|
+ transport = Transport('Telega', 10)
|
|
|
+ print(transport) # Тип транспорта None марки Telega может развить скорость 10 км/ч
|
|
|
+ bike = Transport('shkolnik', 20, 'bike')
|
|
|
+ print(bike) # Тип транспорта bike марки shkolnik может развить скорость 20 км/ч
|
|
|
+
|
|
|
+ first_plane = Plane('Virgin Atlantic', 700, 450)
|
|
|
+ print(first_plane) # Самолет марки Virgin Atlantic может вмещать в себя 450 людей
|
|
|
+ first_car = Car('BMW', 230, 75000, 300)
|
|
|
+ print(first_car) # Тип транспорта Car марки BMW может развить скорость 230 км/ч
|
|
|
+ print(first_car.gasoline) # Осталось бензина на 300 км
|
|
|
+ first_car.gasoline = 20 # Печатает 'Объем топлива увеличен на 20 л и составляет 320 л'
|
|
|
+ print(first_car.gasoline) # Осталось бензина на 350 км
|
|
|
+ second_car = Car('Audi', 230, 70000, 130)
|
|
|
+ second_car.gasoline = [None] # Печатает 'Ошибка заправки автомобиля'
|
|
|
+ first_boat = Boat('Yamaha', 40, 'Petr')
|
|
|
+ print(first_boat) # Этой лодкой марки Yamaha владеет Petr
|
|
|
+ '''
|
|
|
+
|
|
|
+
|
|
|
+ '''
|
|
|
+ sc = Vehicle('Scooter', 100, 2)
|
|
|
+ sc.display()
|
|
|
+
|
|
|
+ merc = Bus("Mercedes", 120000)
|
|
|
+ merc.display()
|
|
|
+
|
|
|
+ polo = Taxi("Volkswagen Polo", 15000)
|
|
|
+ polo.display()
|
|
|
+
|
|
|
+ t = Taxi('x', 111)
|
|
|
+ assert t.__dict__ == {'name': 'x', 'mileage': 111, 'capacity': 4}
|
|
|
+ t.display()
|
|
|
+ b = Bus('t', 123)
|
|
|
+ assert b.__dict__ == {'name': 't', 'mileage': 123, 'capacity': 50}
|
|
|
+ b.display()
|
|
|
+ '''
|
|
|
+
|
|
|
+ '''
|
|
|
+ assert issubclass(Employee, Person)
|
|
|
+
|
|
|
+ emp = Person("just human", 123456)
|
|
|
+ emp.display()
|
|
|
+ assert emp.__dict__ == {'name': 'just human', 'passport': 123456}
|
|
|
+
|
|
|
+ emp2 = Employee("Geek2", 534432, 321321, 'Roga & Koputa')
|
|
|
+ emp2.display()
|
|
|
+ assert emp2.__dict__ == {'salary': 321321, 'department': 'Roga & Koputa',
|
|
|
+ 'name': 'Geek2', 'passport': 534432}
|
|
|
+ '''
|
|
|
+
|
|
|
+ '''
|
|
|
+ rect_1 = Rectangle(3, 2)
|
|
|
+ assert rect_1.area() == 6
|
|
|
+ assert rect_1.perimeter() == 10
|
|
|
+
|
|
|
+ rect_2 = Rectangle(10, 5)
|
|
|
+ assert rect_2.area() == 50
|
|
|
+ assert rect_2.perimeter() == 30
|
|
|
+
|
|
|
+ sq_1 = Square(4)
|
|
|
+ assert sq_1.area() == 16
|
|
|
+ assert sq_1.perimeter() == 16
|
|
|
+
|
|
|
+ sq_2 = Square(10)
|
|
|
+ assert sq_2.area() == 100
|
|
|
+ assert sq_2.perimeter() == 40
|
|
|
+ print('Good')
|
|
|
+ '''
|
|
|
+
|
|
|
+ '''
|
|
|
+ p = Person('Ivan', 'Ivanov')
|
|
|
+ d = Doctor('Petr', 'Petrov', 25)
|
|
|
+ d.info()
|
|
|
+ '''
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|
|
|
+
|
|
|
+
|