2015-06-27 83 views
0

我正在定义一个名为'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() 
+5

我不知道你正在学习Python的教科书或课程,但它是不好的。在适当的Python类中应该有大约两到三倍的代码量。 – TigerhawkT3

+2

完全同意TH。 Python不是Java。也不是C.您可以通过将默认值0赋予大部分变量而非无。然后,尽管你已经(真的)想过unitest,但我建议你看看Python单元测试模块。这是一个很好的介绍:http://www.diveintopython.net/unit_testing/。按照定义和使用的setCar,闻起来也很不错。如果你真的想要,你可以使用*属性*,或者你可以直接赋值。 –

+0

“Car”中的15个方法中,只有5个方法实际上是值得的。其余的只是廉价的魔术师,他们扔东西并挥舞着他们的魔杖,试图用戏法来欺骗你。 – TigerhawkT3

回答

0

有一个在驱动方法的错误,为什么程序崩溃

test above 9 car status: 
fueleffiency = 25 
fuel = 13 

测试9 c.drive(100000) 在驱动方法没有检查如果one_gallon> self.fuellevel而这恰恰 发生在试验9 one_gallon =二十五分之一十万= 4000这是试验后大于 燃料水平8 尝试这种用于驱动

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") 
    elif one_gallon > self.fuelLevel: 
     print("car cannot drive") #or any overflow condition 
    self.fuelLevel -= one_gallon 
    self.odometer += miles 
0

这里有一个drive()方法,从字面上实现你说你想要的东西:

的驱动方法应该坐的车和移动它指定 量英里的一个参数。如果汽车可以在没有用完燃料的情况下实现所有英里数 ,那么汽车将行驶并输出 英里,同时也增加里程表。如果它不能使 行程,仍然有燃料罐中,然后它驱动但长期 直到fuelLevel为0

def drive(self, miles): 
     if miles < 0: 
      return # The car is not driven 

     trip_gallons = miles/self.fuelEfficiency 

     if trip_gallons <= self.fuelLevel: 
      self.odometer += miles 
      print("The car drove {} miles".format(miles)) 
      self.fuelLevel -= trip_gallons 
     else: 
      miles_possible = self.fuelLevel * self.fuelEfficiency 
      self.odometer += miles_possible 
      print("The car drove {} miles".format(miles_possible)) 
      self.fuelLevel = 0 # Out of gas 

你可能要考虑加入一些代码则您的checkCar()如果errorsFound将汽车重置为预期值。这样,一次测试失败就会弄乱所有后续的测试。