我正在定义一个名为'car'的类,我将它与一个对我的类运行一系列测试的文档进行比较。但是,我在Drive Method中发现了错误的答案,我不知道为什么。汽车类面向对象编程Python
这是我的代码。驾驶方法应该把汽车移动一定距离作为参数。如果汽车可以在没有用完燃料的情况下达到所有的里程数,那么汽车会启动行程并输出里程数,同时增加里程表。如果它不能行驶,仍然有油箱中的燃料,然后它驱动,直到fuelLevel
为0.
如果有任何无效的参数给出,那么汽车不应该开车。每次班级在Car Tester程序中进入'测试9'时,它都会中断。所以后面的所有人都会打破。下面我已经发布了我的代码,然后是代码来测试它。
你能帮我吗?我赞赏它
#Define the class
class Car(object):
def __init__(self,fuelEfficiency=0,fuelCapacity=0,fuelLevel=0,odometer=0):
self.setCar(fuelEfficiency,fuelCapacity,fuelLevel,odometer)
def setFuelEfficiency(self,newFuelEfficiency):
self.setCar(fuelEfficiency = newFuelEfficiency)
def setFuelCapacity(self,newFuelCapacity):
self.setCar(fuelCapactity = newFuelCapacity)
def setFuelLevel(self,newFuelLevel):
self.setCar(fuelLevel = newFuelLevel)
def setOdometer(self,newOdometer):
self.setCar(odometer = newOdometer)
def setCar(self,fuelEfficiency = None,fuelCapacity = None,fuelLevel = None,odometer = None):
if fuelEfficiency == None:
fuelEfficiency = self.getFuelEfficiency
if fuelCapacity == None:
fuelCapacity = self.getFuelCapacity
if fuelLevel == None:
fuelLevel = self.getFuelLevel
if odometer == None:
odometer = self.getOdometer
self.fuelEfficiency = fuelEfficiency
self.fuelCapacity = fuelCapacity
self.fuelLevel = fuelLevel
self.odometer = odometer
def drive(self,miles):
if miles < 0:
return ("The car is not driven")
one_gallon = miles/self.fuelEfficiency
if one_gallon < self.fuelLevel:
print("The car drove {} miles".format(miles))
elif self.fuelLevel == 0:
print("The car drove 0 miles")
#else:
#newMiles = milesDriven * miles
#print("The car drove {} miles".format(newMiles))
self.fuelLevel -= one_gallon
self.odometer += miles
def getCar(self):
#Returns a tuple that has (FE,FC,FL,OD)
return (self.fuelEfficiency,self.fuelCapacity,self.fuelLevel,self.odometer)
def addFuel(self,num):
if type(num) == str:
return self.fuelLevel
if num < 0:
print("Sorry, you need to enter a postive number.")
return self.fuelLevel
if (self.fuelLevel + num) > self.fuelCapacity:
return self.getFuelLevel
if (self.fuelLevel + num) == self.fuelCapacity:
self.fuelLevel += num
return self.getFuelLevel
if (self.fuelLevel + num) < self.fuelCapacity:
self.fuelLevel += num
return self.getFuelLevel
def getFuelEfficiency(self):
return self.getCar()[0]
def getFuelCapacity(self):
return self.getCar()[1]
def getFuelLevel(self):
return self.getCar()[2]
def getOdometer(self):
return self.getCar()[3]
def tripRange(self):
numOfMiles = self.fuelEfficiency * self.fuelLevel
return numOfMiles
def __str__(self):
FE = self.getFuelEfficiency()
FC = self.getFuelCapacity()
FL = self.getFuelLevel()
OD = self.getOdometer()
string = '{}:{}:{}:{}'.format(FE,FC,FL,OD)
return string
而这里是测试程序,与测试如果类正常工作,携手并进。如果一切是固定的,输出将是“未发现错误”
from car import *
def main():
c = Car(25, 15)
checkNum(c.tripRange(), 0, 'Test 1')
expected = (25, 15, 0, 0)
checkCar(c, expected, 'Test 2')
c.addFuel(-1)
checkCar(c, expected, 'Test 3')
c.addFuel(1000)
checkCar(c, expected, 'Test 4')
c.addFuel('doctor')
checkCar(c, expected, 'Test 5')
c.addFuel(0)
checkCar(c, expected, 'Test 6')
c.addFuel(15)
expected = (25, 15, 15, 0)
checkCar(c, expected, 'Test 7')
c.drive(50)
expected = (25, 15, 13, 50)
checkCar(c, expected, 'Test 8')
c.drive(100000)
expected = (25, 15, 0, 375)
checkCar(c, expected, 'Test 9')
c.drive(5)
expected = (25, 15, 0, 375)
checkCar(c, expected, 'Test 10')
c.addFuel(10)
expected = (25, 15, 10, 375)
checkCar(c, expected, 'Test 11')
c.drive(-1)
expected = (25, 15, 10, 375)
checkCar(c, expected, 'Test 12')
c.drive(0)
expected = (25, 15, 10, 375)
checkCar(c, expected, 'Test 13')
checkNum(c.tripRange(), 250, 'Test 14')
if not errorsFound:
print('No Errors Found')
def checkCar(car, expected, message):
global errorsFound
mpg, cap, level, odo = expected
if car.getFuelEfficiency() != mpg:
errorsFound = True
print(message + ': Error efficiency. Expected ' + str(mpg))
print('\tCar:', car)
if car.getFuelCapacity() != cap:
errorsFound = True
print(message + ': Error capacity. Expected ' + str(cap))
print('\tCar:', car)
if car.getFuelLevel() != level:
errorsFound = True
print(message + ': Error level. Expected ' + str(level))
print('\tCar:', car)
if car.getOdometer() != odo:
errorsFound = True
print(message + ': Error odometer. Expected ' + str(odo))
print('\tCar:', car)
def checkNum(value, expected, message):
global errorsFound
if value != expected:
errorsFound = True
print(message + ': Error value. Expected {}. Got {}'.format(expected, value))
errorsFound = False
main()
我不知道你正在学习Python的教科书或课程,但它是不好的。在适当的Python类中应该有大约两到三倍的代码量。 – TigerhawkT3
完全同意TH。 Python不是Java。也不是C.您可以通过将默认值0赋予大部分变量而非无。然后,尽管你已经(真的)想过unitest,但我建议你看看Python单元测试模块。这是一个很好的介绍:http://www.diveintopython.net/unit_testing/。按照定义和使用的setCar,闻起来也很不错。如果你真的想要,你可以使用*属性*,或者你可以直接赋值。 –
“Car”中的15个方法中,只有5个方法实际上是值得的。其余的只是廉价的魔术师,他们扔东西并挥舞着他们的魔杖,试图用戏法来欺骗你。 – TigerhawkT3