2010-03-23 145 views
1

我需要制作一个电视,向用户显示频道和音量,并显示电视是否打开。我有大部分的代码,但由于某些原因,通道不会切换。我很不熟悉物业是如何运作的,我认为这就是我的问题所在。请帮助。我正在模拟电视

class Television(object): 

    def __init__(self, __channel=1, volume=1, is_on=0): 
     self.__channel=__channel 
     self.volume=volume 
     self.is_on=is_on 

    def __str__(self): 
     if self.is_on==1: 
      print "The tv is on" 
      print self.__channel 
      print self.volume 
     else: 
      print "The television is off." 

    def toggle_power(self): 
     if self.is_on==1: 
      self.is_on=0 
      return self.is_on 
     if self.is_on==0: 
      self.is_on=1 
      return self.is_on 

    def get_channel(self): 
     return channel 

    def set_channel(self, choice): 
     if self.is_on==1: 
      if choice>=0 and choice<=499: 
       channel=self.__channel 
      else: 
       print "Invalid channel!" 
     else: 
      print "The television isn't on!" 

    channel=property(get_channel, set_channel) 

    def raise_volume(self, up=1): 
     if self.is_on==1: 
      self.volume+=up 
      if self.volume>=10: 
       self.volume=10 
       print "Max volume!" 
     else: 
      print "The television isn't on!" 

    def lower_volume(self, down=1): 
     if self.is_on==1: 
      self.volume-=down 
      if self.volume<=0: 
       self.volume=0 
       print "Muted!" 
     else: 
      print "The television isn't on!" 

def main(): 

    tv=Television() 
    choice=None 
    while choice!="0": 
     print \ 
     """ 
     Television 

     0 - Exit 
     1 - Toggle Power 
     2 - Change Channel 
     3 - Raise Volume 
     4 - Lower Volume 
     """ 

     choice=raw_input("Choice: ") 
     print 

     if choice=="0": 
      print "Good-bye." 

     elif choice=="1": 
      tv.toggle_power() 
      tv.__str__() 

     elif choice=="2": 
      change=raw_input("What would you like to change the channel to?") 
      tv.set_channel(change) 
      tv.__str__() 

     elif choice=="3": 
      tv.raise_volume() 
      tv.__str__() 

     elif choice=="4": 
      tv.lower_volume() 
      tv.__str__() 

     else: 
      print "\nSorry, but", choice, "isn't a valid choice." 

main() 

raw_input("Press enter to exit.") 

回答

5
  1. 通道号是整数,但返回的raw_input串。应该是:

    change = int(raw_input("What would you like to change the channel to?")) 
    
  2. 也是你set_channel功能有这样的:

    channel=self.__channel 
    

    当它应该是:

    self.__channel = choice 
    

这两个变化,使其工作。

3

EXTRA提示:

发布这个社区维基所以每个人都可以有想法和提示帮助。

  • 请勿将您的属性命名为以两个下划线开头。它意思是私人的。如果您想要某个专用名称,请使用单个下划线。
  • 您并未真正使用您创建的channel属性。
  • 使用True和False代替1和0代替is_on
  • __str__方法应该返回一个字符串,而不是打印一个。然后,你不必直接调用它,你只打印实例,它将被蟒蛇被调用使用(一般你不调用该方法,启动和结束与两个下划线自己)

代码以上提示:

class Television(object): 
    def __init__(self, channel=1, volume=1, is_on=False): 
     self._channel= channel 
     self.volume = volume 
     self.is_on = is_on 

    def __str__(self): 
     volume = self.volume 
     if not volume: 
      volume = 'muted' 
     elif volume == 10: 
      volume = 'max' 
     if self.is_on: 
      return "The TV is on, channel {0}, volume {1}".format(self.channel, volume) 
     else: 
      return "The TV is off." 

    def toggle_power(self): 
     self.is_on = not self.is_on 
     return self.is_on 

    def get_channel(self): 
     return self._channel 

    def set_channel(self, choice): 
     self._check_on() 
     if 0 <= choice <= 499: 
      self._channel = choice 
     else: 
      raise ValueError('Invalid channel') 

    channel = property(get_channel, set_channel) 

    def _check_on(self): 
     if not self.is_on: 
      raise ValueError("The television isn't on") 

    def raise_volume(self, up=1): 
     self._check_on() 
     self.volume += up 
     if self.volume >= 10: 
      self.volume = 10 

    def lower_volume(self, down=1): 
     self._check_on() 
     self.volume -= down 
     if self.volume <= 0: 
      self.volume = 0 

def main(): 
    tv = Television() 
    while True: 
     print 'Status:', tv 
     print \ 
     """ 
     Television 

     0 - Exit 
     1 - Toggle Power 
     2 - Change Channel 
     3 - Raise Volume 
     4 - Lower Volume 
     """ 
     choice=raw_input("Choice: ") 

     try: 
      if choice=="0": 
       break 
      elif choice=="1": 
       tv.toggle_power() 
      elif choice=="2": 
       change=int(raw_input("What would you like to change the channel to? ")) 
       tv.set_channel(change) 
      elif choice=="3": 
       tv.raise_volume() 
      elif choice=="4": 
       tv.lower_volume() 
      else: 
       raise ValueError("Sorry, but {0} isn't a valid choice.".format(choice)) 
     except ValueError as e: 
      print '\n\n *** ERROR: {0}\n'.format(e) 

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