# Теперь тоже самое, но с фичами ООП

class Rocket:
    def __init__(self, tank, fuel, consumption, payload="CubeSat v3"):
        """
        Метод __init__ вызывается при создании класса. Обычно в нём инициализируют нужные поля (переменные)
        """

        self.tank = tank
        self.fuel = fuel
        self.consumption = consumption
        self.payload = payload
        self.engine = False
        self.distance = 0

    def start_engine(self):
        """
        Запуск двигателя. Обратите внимание, раньше нужно было явно передать в функцию ракету, у которой хотим
        включить двигатель. Сейчас т.к. это не внешняя функция, а метод класса, питон сам поймёт, у какой ракеты
        вызывается этот метод (можно условно считать, что "self" теперь заменяет ракету в параметрах)
        """

        self.engine = True
        print("Двигатель включён!")

    def fly(my_rocket, distance):
        """
        Ракета летит на заданное расстояние. "self" не обязательно называть так, это такая же переменная, как и
        любой другой аргумент -- например здесь я назвал её "my_rocket". Просто принято "self", чтобы никто не путался
        """

        if my_rocket.engine:
            fuel_required = my_rocket.consumption * distance
            if fuel_required > my_rocket.tank:
                print("У ракеты нет столько топлива!")
            else:
                print("Поехали!")
                my_rocket.distance += distance
                my_rocket.tank -= fuel_required

        else:
            print("У ракеты выключен двигатель!")

    def deploy_payload(self):
        """
        Выпускаем полезную нагрузку на орбиту
        """

        if self.payload != "":
            print(self.payload, "теперь в", self.distance, "километрах от начальной точки")
            self.payload = ""  # выпустили спутник в космос
        else:
            print("У ракеты уже нет ничего внутри!")


# тот же код для проверки работоспособности

soyuz_2 = Rocket(100, "T-1", 1, "Союз МС-29")
print(soyuz_2)          # в этот раз вывод в консоли окажется несколько другим...
                        # <__main__.Rocket object at 0x000001E30B078C20>
                        # это ссылка на объект в памяти компьютера
                        # мы с ней ничего полезного сделать, в общем-то не можем

print(type(soyuz_2))    # из прикольного можно ещё сделать вот так, это выведет
                        # в консоль тип переменной "soyuz_2"
                        # <class '__main__.Rocket'> -- здесь видно, что переменная
                        # "soyuz_2" -- это экземпляр класса Rocket

print(soyuz_2.payload)  # можно посмотреть отдельно разные поля
print(soyuz_2.fuel)

SLS = Rocket(500, "H2", 2.5)    # здесь не указали полезную нагрузку, поэтому
                                # будет использовано значение по умолчанию -- "CubeSat v3"

print(soyuz_2.engine)  # до включения
soyuz_2.start_engine()
print(soyuz_2.engine)  # после включения


soyuz_2.fly(500)  # топлива не хватит
soyuz_2.fly(50)   # а тут хватит
SLS.fly(100)      # а у этой ракеты вообще двигатель не включён


soyuz_2.deploy_payload()
soyuz_2.deploy_payload()  # второй раз не получится
