|  | @@ -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()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 |