können Sie verkürzen
def flip(self):
''' Sets switch to opposite position.'''
if self.state == True:
self.state = False
elif self.state == False:
self.state = True
zu
def flip(self):
''' Sets switch to opposite position.'''
self.state = not self.state
und auf Ihrer Telefonzentrale für
def flip_every(self, n):
for i in range(0, len(self.switchboard), n):
if self.switchboard[n] == True:
self.switchboard[n] = False
else:
self.switchboard[n] = True
zu
def flip_every(self, n):
for i in range(0, self.quantity, n):
self.switchboard[n] = not self.switchboard[n]
# you could also just use self.flip(n) instead
und
def flip(self, n):
self.switchboard[n] = not self.switchboard[n]
Als nette Geste: verwenden Sie Art-der gleichen Iteration in which_switch(self)
und __str__(self):
, die auf den Indizes der Schalter betätigt, die on
sind. Ich baute eine kleine def getOnIndexes(self): ...
, die Sie eine int-Liste dieser Indizes zurückgibt, und rufen Sie dies in beiden Methoden (DRY - wiederholen Sie sich Prinzip) mit einer Kurzschrift zum Erstellen von Indizes auf der Grundlage einer Liste Verständnis.
def getOnIndexes(self):
return [i for i in range(self.quantity) if self.switchboard[i] == True]
Insgesamt ein wirklich schönes kleines OOP-Beispiel.
Was mich aber verblüfft hatte, ist, warum ein Switchboard IS_A Lightswitch - ich würde es etwas anders modellieren, sagen Telefonistin LightSwitch'es HAS, dazu kommen:
Ihre Basisklasse
class LightSwitch():
def __init__(self, default_state):
'''
default_state can only be 'on' or 'off'.
'''
if default_state == 'on':
self.state = True
elif default_state == 'off':
self.state = False
def turn_on(self):
self.state = True
def turn_off(self):
self.state = False
def flip(self):
self.state = not self.state
def __str__(self):
if self.state == True:
return 'I am on'
if self.state == False:
return 'I am off'
def isOn(self):
return self.state
def isOff(self):
return not self.isOn()
Meine alternative Schalttafel:
class AlternateSwitchBoard():
''' '''
def __init__(self, quantity, default_state):
''' '''
self.default_state = default_state
self.switchboard = [LightSwitch(default_state) for x in range(quantity)]
self.state = False
self.quantity = quantity
def __str__(self):
retVal = ""
for i in range(self.quantity):
if self.switchboard[i].isOn():
retVal += ", On"
else:
retVal += ", Off"
return "Switchboard: " + retVal[1:].strip()
def which_switch(self):
print(self.getOnIndexes())
def flip(self, n):
self.switchboard[n].flip()
def flip_every(self,stride):
for i in range(0, self.quantity, stride):
self.switchboard[i].flip()
def reset(self):
self.switchboard = [LightSwitch(default_state) for x in range(quantity)]
def getOnIndexes(self):
return [i for i in range(self.quantity) if self.switchboard[i].isOn()]
s2 = AlternateSwitchBoard(10, "off")
s2.flip(2)
s2.flip(7)
print(str(s2))
s2.flip_every(2)
print(str(s2))
s2.which_switch()
Ausgang:
Können Sie den Code bereitstellen, der 'LightSwitch' aufruft? – mjwatts
Schönes Beispiel, ich habe sogar etwas gelernt, während ich einige Ihrer Methoden pythonisierte: o) –