飞船对象
我正在尝试制作一个程序,用来创建一艘宇宙飞船。我使用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.")
2 个回答
4
在你的 status
方法里,self
没有被定义,因为你把这个方法设成了静态方法。其实把它设成非静态方法更合理,因为每艘船都有自己独特的名字。所以你只需要这样写:
def status(self):
print "Name: ", self.name
print "Fuel level: ", self.fuel
然后再调用:
ship1.status()
ship2.status()
ship3.status()
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。因为self这个词只在类的方法里有效。
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.")