tstacy
tstacy

Reputation: 21

Car class errors

I am having troubles figuring out this problem. I was given 2 separate codes and this is where I am having troubles at. I am getting an error in line 38 that is "UnboundLocalError: local variable 'year' referenced before assignment" I'm not exactly sure what I am doing wrong, I am new to Python but any assistance is greatly appreciated.

class Car:
    def __init__(self, year_model, make, speed):
        self.__year_model = year_model
        self.__make = make
        self.__speed = 0

    ############# year_model################
    def setYear_model(self, year_model):
        self.__year_model = year_model

    def getYear_model(self):
        return self.__year_model

    ############# Make################
    def setMake(self, make):
        self.__make = make

    def getMake(self):
        return self.make

    ############# speed################
    def set_Speed(self, speed):
        if speed < 0:
            print("Speed cannot be negative")
        else:
            self.__speed = speed

    def get_Speed(self):
        return self.__speed

    ############# str ############
    def __str__(self):
        return "Make : " + self.__make + ", Model Year :" + \
            self.__year_model + ", speed =" + str(self.__speed)

    def accelerate(self):
        self.__speed = self.__speed +5

    def brake(self):
        self.__speed = self.__speed -5


def main():

    year=(input('car year: '))
    make=(input('car make: '))
    speed=0
    my_car = Car(year, make, speed)
    print('Current speed is', speed)

    #accelerate 5 times

    my_car.accelerate()
    print('My current speed:',my_car.get_speed())
    my_car.accelerate()
    print('My current speed:',my_car.get_speed())
    my_car.accelerate()
    print('My current speed:',my_car.get_speed())
    my_car.accelerate()
    print('My current speed:',my_car.get_speed())
    my_car.accelerate()
    print('My current speed:',my_car.get_speed())

    #brake five times
    my_car.brake()
    print('My current speed after brake:',my_car.get_speed())
    my_car.brake()
    print('My current speed after brake:',my_car.get_speed())
    my_car.brake()
    print('My current speed after brake:',my_car.get_speed())
    my_car.brake()
    print('My current speed after brake:',my_car.get_speed())
    my_car.brake()
    print('My current speed after brake:',my_car.get_speed())

main()

which then is connected to this code.

import ct_CarDefinition

def main():
    # Create an instance of Car
    my_car = ct_CarDefinition.Car("2008", "Honda Accord")

    print(my_car)

main()

Upvotes: 2

Views: 733

Answers (2)

Ujjwal
Ujjwal

Reputation: 3168

Try this:

def main():
    year=(input('car year: '))
    make=(input('car make: '))
    speed=0
    my_car = Car(year, make, speed)  #use this once you have assigned values for "year", "make", "speed"

Also, change the following in your class definition:

class Car:
    def __init__(self, year_model, make, speed):        #add "speed" parameter
        self.__year_model = year_model
        self.__make = make
        self.__speed = 0 

Also, you are not defining "accelerate" and "brake" methods in your Car class. Thus using my_car.accelerate() or my_car.brake() is going to throw an error:

AttributeError: Car instance has no attribute 'accelerate'

You can add the following methods to the Car class:

############# accelerate ################
def accelerate(self):
    self.__speed = self.__speed +5

############# brake ################
def brake(self):
    self.__speed = self.__speed -5

Also change the names to these two methods as you are calling set_speed and get_speed in your main method.

############# speed################
def set_speed(self, speed):
    if speed < 0:
        print("Speed cannot be negative")
    else:
        self.__speed = speed

def get_speed(self):
    return self.__speed

Output:

#car year: 1998
#car make: "Honda Accord"
#('Current speed is', 0)
#('My current speed:', 5)
#('My current speed:', 10)
#('My current speed:', 15)
#('My current speed:', 20)
#('My current speed:', 25)
#('My current speed after brake:', 20)
#('My current speed after brake:', 15)
#('My current speed after brake:', 10)
#('My current speed after brake:', 5)
#('My current speed after brake:', 0)

Upvotes: 3

abarnert
abarnert

Reputation: 365945

You're trying to use the variable year (and, likewise, make and speed) before you set it to anything:

my_car = Car(year, make, speed)

year=(input('car year: '))
make=(input('car make: '))
speed=0

You can't create a 2008 Honda Accord before you've asked the user for his preferred year and make unless you can somehow read the user's mind; for all you know he could ask for a 2014 Porsche Boxster. So, just create the Car after you know what care you want to create.

Also, you're trying to pass three arguments to Car(year, make, speed), but it only takes two. A Car always starts with speed 0, so you don't have to pass it one.

year=(input('car year: '))
make=(input('car make: '))

my_car = Car(year, make)

There are some languages, called dataflow programming languages, that let you create "incomplete values" like this, so my_car would be an ambiguous Car, but as long as you don't try to use it until year, make, and speed are filled in, nobody cares that it's incomplete. But Python isn't such a language, nor are most other languages you're likely to use.

Upvotes: 3

Related Questions