【问题标题】:How to make a class(SwitchBoard) which change the switches' on and off?如何制作一个改变开关的开和关的类(SwitchBoard)?
【发布时间】:2016-02-22 06:06:44
【问题描述】:

我想构建一个具有以下属性的类 SwitchBoard:

• 当我创建一个交换机时,我应该能够设置它包含的交换机数量。

• 所有开关都应从“关闭”位置开始。

• 如果我打印一个交换机,它应该打印如下内容:“以下开关是 开:0 2 4 6 8"。

• which switch 方法应该返回一个整数列表,表示打开的开关,在 顺序(例如,[1,3,5,7,9])。

• 如果我用 n 作为整数调用 flip(n),它应该翻转第 n 个灯开关的状态。

• 如果我用 n 作为整数调用 flip every(n),它应该翻转每个第 n 个灯开关的状态,开始 在 0。因此,flip every(2) 将翻转开关 0、2、4、6 等。

• 方法reset(),应该关闭所有开关。

• 如果我要求总机拨动一个不存在的开关,什么都不会发生(它不应该崩溃)

所以,我首先构建了一个运行良好的 Lightswitch。

class LightSwitch():
''' A class to reprenset a general light switch'''

    def __init__(self, light_state):
        if(light_state == 'on'):
            mode = True
        else:
            mode = False
        self._state = mode

    def __str__(self):
        if(self._state == True):
           return 'I am on'
        if(self._state == False):
            return 'I am off'

    def turn_on(self):
        if(self._state == False):
            self._state = not self._state

    def turn_off(self):
        if(self._state == True):
            self._state = not self._state

    def flip(self):
        self._state = not self._state

对于 SwitchBoard,这就是我所得到的。

class SwitchBoard():

    def __init__(self, num_switch):
        self.switches = []
        for i in range(num_switch):
            self.switches.append(LightSwitch('off'))

    def __str__(self):
        switch_on = ''
        switch_on_list = self.which_switch()
        for i in range(0, len(switch_on_list)):
            switch_on += ' ' + str(switch_on_list[i])
        return 'The following switches are on:' + switch_on

    def which_switch(self):
        switch_on_list = []
        for i in range(0, len(self.switches) - 1):
            if(self.switches[i] == True):
                switch_on_list.append(i)
        return switch_on_list

    def flip(self, switch_index):
        if(switch_index <= len(self.switches) -1 ):
        self.switches[switch_index].flip()

    def flip_every(self, step):
        for i in range(0,len(self.switches), step):
            self.flip(i)        

    def reset(self):
        for every_switch in self.switches:
            every_switch.turn_off()


if(__name__==("__main__")):
s = SwitchBoard(10)
s.flip(2)
print(s)
print(s.which_switch())
s.flip_every(2)
print(s)
print(s.which_switch())  

这行不通。翻转似乎不起作用,我不知道为什么。 请帮忙!

【问题讨论】:

  • 在 which_switch 函数中,你错过了它:不是 if(self.switches[i] == True): 而是 if(self.switches[i]._state == True):
  • 现在可以使用了!非常感谢!
  • 请不要在收到满意答复后删除您的问题。它欺骗了可能从中受益的世界其他地方以及回答者。

标签: python function class boolean


【解决方案1】:

试试

def which_switch(self):
    switch_on_list = []
    for i in range(0, len(self.switches) - 1):
        if(self.switches[i]._state == True):
            switch_on_list.append(i)
    return switch_on_list

但实际上,您应该在 LightSwitch 中添加一个 getter,并使用这个 getter,因为访问带下划线的变量不是很干净... 例如,您可以添加:

is_on(self):
    return self._state

并像这样使用它:

if(self.switches[i].is_on()):

但是,很棒的代码,只是有点失误。

顺便说一句,你还有其他错误:

if(switch_index <= len(self.switches) -1 ):

不干净,因为你从不禁止负数。

【讨论】:

  • 我同意.. 正要发布相同的内容。其中一些 for..range() 循环有问题.. 在大多数情况下,最好使用迭代器迭代 python 列表,例如 for switch in list_of_switches: .. 更不容易出错
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
相关资源
最近更新 更多