Поток управления Python возвращается «назад» вместо движения вперед

#python #class #inheritance

#python #класс #наследование

Вопрос:

Прежде всего, я буквально не мог придумать лучшего названия для этого вопроса, поэтому, пожалуйста, потерпите меня.

В настоящее время я пишу программу на Python, которая имеет 3 класса (1 родительский и 2 дочерних класса), где пользователя просят описать различные функции автомобиля или пикапа, чтобы впоследствии добавить транспортное средство в виртуальный гараж (словарь). В зависимости от того, какой тип транспортного средства выбран, будут заданы некоторые общие вопросы, а также конкретные вопросы, относящиеся к типу транспортного средства:

 class Vehicle:

def __init__(self):
    self.vehicle_type_request = int(input("Hello! Press 1 to add a Car to your garage or 2 to add a Pickup: "))
    self.make = input("Please enter the make of your vehicle: ")
    self.model = input("Please enter the model of your vehicle: ")
    self.color = input("Please enter the color of your vehicle: ")
    self.fuel_type = input("Please enter the fuel type: ")
    self.options = []

def welcome_message(self):
    if self.vehicle_type_request == 1:
        self.vehicle_type_request = Cars()
    else:
        self.vehicle_type_request = Pickup()
    return self.vehicle_type_request
  

Однако, как только все сказано и сделано, моя программа выдает мне это. После того, как он задает последний вопрос «Пожалуйста, выберите любые применимые параметры транспортного средства:», он возвращается к первому вопросу:

 Hello! Press 1 to add a Car to your garage or 2 to add a Pickup: 1
Please enter the make of your vehicle: test
Please enter the model of your vehicle: test
Please enter the color of your vehicle: test
Please enter the fuel type: test
Please choose any applicable vehicle options: test
Hello! Press 1 to add a Car to your garage or 2 to add a Pickup: 1
Please enter the make of your vehicle: test
Please enter the model of your vehicle: test
Please enter the color of your vehicle: test
Please enter the fuel type: test
Please enter the engine size: test
How many doors does your vehicle have? 2
Hello! Press 1 to add a Car to your garage or 2 to add a Pickup: 2
Please enter the make of your vehicle: test
Please enter the model of your vehicle: test
Please enter the color of your vehicle: test
Please enter the fuel type: test
Please enter the cab style: test
Please enter the bed length: test

Process finished with exit code 0
  

Теоретически программа должна была перейти к конкретным вопросам, касающимся транспортного средства, в зависимости от того, какой вариант выбрал пользователь. Выберите 1, вы получите:

 class Cars(Vehicle):

    def __init__(self):
        super().__init__()
        **self.engine_size = float(input("Please enter the engine size: "))
        self.num_doors = int(input("How many doors does your vehicle have? "))**

    def get_engine_size(self):
        return self.engine_size

    def get_num_doors(self):
        return self.num_doors
  

Или:

получение класса (транспортное средство):

 def __init__(self):
    super().__init__()
    self.cab_style = input("Please enter the cab style: ")
    self.bed_length = float(input("Please enter the bed length: "))

def get_cab_style(self):
    return self.cab_style

def get_bed_length(self):
    return self.bed_length
  

Будет ли это иметь какое-либо отношение к тому, как вызываются функции?

 new_vehicle = Vehicle()
new_vehicle.get_make()
new_vehicle.get_model()
new_vehicle.get_color()
new_vehicle.get_fuel_type()
new_vehicle.get_options()

new_vehicle_car = Cars()
new_vehicle_car.get_engine_size()
new_vehicle_car.get_num_doors()

new_vehicle_pickup = Pickup()
new_vehicle_pickup.get_cab_style()
new_vehicle_pickup.get_bed_length()
  

Любая помощь будет оценена. Вот вся моя программа до сих пор, вместо отдельных фрагментов:

 class Vehicle:

    def __init__(self):
        self.vehicle_type_request = int(input("Hello! Press 1 to add a Car to your garage or 2 to add a Pickup: "))
        self.make = input("Please enter the make of your vehicle: ")
        self.model = input("Please enter the model of your vehicle: ")
        self.color = input("Please enter the color of your vehicle: ")
        self.fuel_type = input("Please enter the fuel type: ")
        self.options = []

    def welcome_message(self):
        if self.vehicle_type_request == 1:
            self.vehicle_type_request = Cars()
        else:
            self.vehicle_type_request = Pickup()
        return self.vehicle_type_request

    def get_make(self):
        return self.make

    def get_model(self):
        return self.model

    def get_color(self):
        return self.color

    def get_fuel_type(self):
        return self.fuel_type

    def get_options(self):
        self.options = input("Please choose any applicable vehicle options: ")


class Cars(Vehicle):

    def __init__(self):
        super().__init__()
        self.engine_size = float(input("Please enter the engine size: "))
        self.num_doors = int(input("How many doors does your vehicle have? "))

    def get_engine_size(self):
        return self.engine_size

    def get_num_doors(self):
        return self.num_doors


class Pickup(Vehicle):

    def __init__(self):
        super().__init__()
        self.cab_style = input("Please enter the cab style: ")
        self.bed_length = float(input("Please enter the bed length: "))

    def get_cab_style(self):
        return self.cab_style

    def get_bed_length(self):
        return self.bed_length


new_vehicle = Vehicle()
new_vehicle.get_make()
new_vehicle.get_model()
new_vehicle.get_color()
new_vehicle.get_fuel_type()
new_vehicle.get_options()

new_vehicle_car = Cars()
new_vehicle_car.get_engine_size()
new_vehicle_car.get_num_doors()

new_vehicle_pickup = Pickup()
new_vehicle_pickup.get_cab_style()
new_vehicle_pickup.get_bed_length()
  

Комментарии:

1. серьезно посмотрите welcome_message , экземпляр родительского класса имеет члены, которые являются экземплярами дочерних классов, не делайте input() этого в конструкторе, это не позволяет вам использовать разные источники, такие как файлы

2. если вы говорите, что поток программы — это не то, что вы хотите, также сообщите, что вы ожидаете, что программа должна делать.

Ответ №1:

Я предлагаю OP следовать лучшему руководству по изучению Python / программированию. Я не знаю, с чего начать, чтобы научить вас основам программирования, но я могу перечислить несколько замечаний о том, где вы ошиблись:

  1. В коде .get_**() функции не имеют абсолютно никакого эффекта. Вы можете удалить строки и заметить, что программа ведет себя точно так же.
  2. Поток не пошел назад, программа сделала именно то, что вы сказали ей делать. В new_vehicle = Vehicle() , new_vehicle_car = Cars() и new_vehicle_pickup = Pickup() , каждый раз, когда он запрашивает у вас все входные данные (всего 3 раза). Вы можете удалить некоторые строки, чтобы увидеть эффект.

Учиться программировать — это очень весело, я только хочу оказать некоторую помощь здесь. Я предлагаю OP понять больше основ, прежде чем пытаться связываться с классом.