import abc class State(object, metaclass=abc.ABCMeta): def __init__(self): self.color_index = 0 @abc.abstractmethod def light(self): COLORS = ["Green", "Red", "Blue", "Yellow"] state_color = COLORS[self.color_index] self.color_index += 1 if self.color_index == len(COLORS): self.color_index = 0 return state_color class Lamp(State): def __init__(self): super().__init__() self.color = None def light(self): self.color = super().light() return self.color if __name__ == '__main__': # These "asserts" using only for self-checking and not necessary for auto-testing lamp_1 = Lamp() lamp_2 = Lamp() lamp_1.light() # Green lamp_1.light() # Red lamp_2.light() # Green assert lamp_1.light() == "Blue" assert lamp_1.light() == "Yellow" assert lamp_1.light() == "Green" assert lamp_2.light() == "Red" assert lamp_2.light() == "Blue" print("Coding complete? Let's try tests!")