如何操作一个顺序开启开关的接线板?Python 3x

0 投票
1 回答
1232 浏览
提问于 2025-04-17 13:45

我想要创建一个叫做 SwitchBoard 的类,具备以下功能:

  • 当我创建一个开关板时,可以设置它包含的开关数量,所有开关一开始都是“关”的状态。

  • 如果我打印开关板,它应该显示类似于:“以下开关是开着的:1 3 5 7 9”的内容。

  • 如果我调用 switch(n),其中 n 是一个整数,它应该切换第 n 个开关的状态。

  • 如果我调用 switch every(n),其中 n 也是一个整数,它应该切换每个第 n 个开关的状态。

我应该能够写一段全局代码,解决上述的开关问题。

这是我目前的工作,首先是类 LightSwitch

  • 如果开关是开着的,它会切换并变为关。

  • 如果开关是关着的,它会切换并变为开。

class LightSwitch():

    def __init__(self, mode):
            self.switch = mode

    def __str__(self):
        if self.switch == True:
            return ("I am on")

        if self.switch == False:
            return ("I am off")        

    def turn_on(self):
        self.switch = True

    def turn_off(self):
        self.switch = False

    def flip(self):
        if self.switch == True:
            self.switch = False
        else:
            self.switch = True

对于类 SwitchBoard,我现在有的代码是:

class SwitchBoard():

    def __init__(self, n):
        self.switches = []
        for i in range(n):
            self.switches.append(LightSwitch(False))

    def switch(self, n):
        self.switches[n].flip()

    def switch_every(self, n):
        for i in range(0,len(self.switches), n):
            switch(i)

    def __str__(self):
        return "The following switches are on: " + str(self.switches)


if __name__ == ('__main__'):

    my_light = LightSwitch(False)
    my_light.flip()
    print (my_light) # This prints "I am on"

    my_light2 = LightSwitch(True)
    my_light2.flip()
    print(my_light2) # This prints "I am off"

    my_switchboard = SwitchBoard(10) # This is the issue.
    my_switchboard.switch_every(2)
    print (my_switchboard)

这段代码没有成功,我正在使用一个列表来记录关着的开关数量,但我不确定如何写全局代码来解决这个问题,比如在一个序列中打开开关,或者可能缺少什么,请帮帮我。

1 个回答

2

要调用这个方法 switch,你应该用 self.switch(i),而不是 switch(i)

def switch_every(self, n):
    for i in range(0,len(self.switches), n):
        self.switch(i)   # <-- Change here

当你调用时,如果想要看到一些易读的输出,可以这样做:

 print (my_switchboard)     

LightSwitch.__str__ 方法改成 LightSwitch.__repr__

 def __repr__(self):   # <-- Change `__str__` to `__repr__`
     if self.switch == True:
         return "I am on"

     if self.switch == False:
         return "I am off"

这是因为,当你打印一个列表的时候,它里面的内容会用 repr 的方式显示出来。


你可以把 LightSwitch.flip 方法简化成:

 def flip(self):
     self.switch = False if self.switch else True

使用一个 条件表达式

撰写回答