2010-03-23 77 views
3

我想制作一个创建宇宙飞船的程序,我使用status()方法来显示船的名称和燃料值。但是,它似乎并没有工作。我想我可能已经搞糟了status()方法。我也试图让我可以改变燃料价值,但我不想创造一种新的方法来做到这一点。我想我已经在那里发生了一个可怕的错误转向。请帮助!飞船对象

class Ship(object): 

    def __init__(self, name="Enterprise", fuel=0): 
     self.name=name 
     self.fuel=fuel 
     print "The spaceship", name, "has arrived!" 

    def status(): 
     print "Name: ", self.name 
     print "Fuel level: ", self.fuel 
    status=staticmethod(status) 

def main(): 

    ship1=Ship(raw_input("What would you like to name this ship?")) 
    fuel_level=raw_input("How much fuel does this ship have?") 
    if fuel_level<0: 
     self.fuel=0 
    else: 
     self.fuel(fuel_level) 

    ship2=Ship(raw_input("What would you like to name this ship?")) 
    fuel_level2=raw_input("How much fuel does this ship have?") 
    if fuel_level2<0: 
     self.fuel=0 
    else: 
     self.fuel(fuel_level2) 

    ship3=Ship(raw_input("What would you like to name this ship?")) 
    fuel_level3=raw_input("How much fuel does this ship have?") 
    if fuel_level3<0: 
     self.fuel=0 
    else: 
     self.fuel(fuel_level3) 

    Ship.status() 

main() 

raw_input("Press enter to exit.") 

回答

4

每艘船都有自己的燃料,所以静是不是要走的路。如果您不希望参数看起来像一个方法,请考虑一个属性。它也封装了对燃料的价值检查。

class Ship(object): 

    def __init__(self, name="Enterprise", fuel=0): 
     self.name = name 
     self._fuel = fuel 
     print "The spaceship", name, "has arrived!" 

    def status(self): 
     print "Name: ", self.name 
     print "Fuel level: ", self.fuel 

    @property 
    def fuel(self): 
     return self._fuel 

    @fuel.setter 
    def fuel(self,level): 
     if level < 0: 
      self._fuel = 0 
     else: 
      self._fuel = level 

在main(),可以考虑环路初始化船舶和显示状态,而不是重复代码,并使用ship.fuel代替self.fuel。自我只在班级的方法中有效。

def main(): 

    ships = [] 
    for n in range(4): 
     ship = Ship(raw_input("What would you like to name this ship?")) 
     ship.fuel = int(raw_input("How much fuel does this ship have?")) 
     ships.append(ship) 

    for ship in ships: 
     ship.status() 

main() 
raw_input("Press enter to exit.") 
4

在你status方法self是没有定义的,因为你做它的静态方法。让它变得非静态更有意义,因为每艘船都有自己的名字。所以刚才说

def status(self): 
    print "Name: ", self.name 
    print "Fuel level: ", self.fuel 

,过一会儿给

ship1.status() 
ship2.status() 
ship3.status() 
+0

+1。此外,果酱,确保您的缩进是正确的。 '__init__'和'status'必须在你的类定义中缩进。 – 2010-03-23 14:23:38

+1

是的。我很想知道为什么OP认为它应该是一个静态方法。 – 2010-03-23 14:43:01

+2

他们缩进,它只是没有这样做,当我在这里复制它。好吧。哈哈,我不知道为什么我决定它应该是静态的。我正在研究Python书,并且刚刚介绍了静态方法,所以我试图完成这项工作。但我想我应该只在有意义时才使用它! – Jam 2010-03-23 14:49:29