Reputation: 21
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
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
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