2017-11-17 2 views
1

Ich versuche, mich über OOP in Python zu unterrichten und habe wirklich Probleme.Utalisierung von Klassen in Python

Ich habe folgendes:

 def __init__(self, quantity): 
      ''' ''' 
      self.switchboard = [] 
      self.state = False 
      self.quantity = quantity 
      for i in range(quantity): 
       self.switchboard.append(i) 

     def __str__(self): 
      self.on_list = [] 
      for i in range(self.quantity): 
       if i == True: 
        self.on_list.append(i) 
      return("The following switches are on " + str(self.on_list)) 
     def which_switch(self): 
      for i in range(len(self.switchboard)): 
       self.on_list = [] 
       if self.switchboard[i] == True: 
        on_list.append(i) 
       print(on_list) 

     def flip(self, n): 
      if self.switchboard[n] == True: 
       self.switchboard[n] = False 
      else: 
       self.switchboard[n] = True 

Als ich es drucken, ich The following switches are on [1] bekommen. Obwohl ich 10 in die Parameter eingegeben habe. Ich möchte, dass es alle Schalter anzeigt, die in diesem Fall Null sein sollten, da ihr Anfangszustand "aus" ist.

+0

Können Sie den Code bereitstellen, der 'LightSwitch' aufruft? – mjwatts

+0

Schönes Beispiel, ich habe sogar etwas gelernt, während ich einige Ihrer Methoden pythonisierte: o) –

Antwort

1

In __str__ die Zeile ändern:

if i == True: 

zu:

if self.switchboard[i]: 

Denken Sie daran: i ist nur ein Index, was Sie wollen, ist das i-te Element in Telefonzentrale zugreifen!

Es gibt auch einen anderen Fehler, in Methode which_switch():

on_list.append(i) 

sein sollte:

self.on_list.append(i) 

und gleiche gilt für die Druckzeile darunter.

Ausgang nach der Änderung:

The following switches are on [1, 2, 3, 4, 5, 6, 7, 8, 9] 

Nun, ich kann nur vermuten, dass das, was Sie wollten eigentlich im Konstruktor zu tun ist:

def __init__(self, quantity): 
    ''' ''' 
    self.switchboard = [] 
    self.state = False 
    self.quantity = quantity 
    for i in range(quantity): 
     self.switchboard.append(LightSwitch('off')) # create light-switch and set it to 'off' 

und dann, wenn Sie sie drucken - print nur die, die sind:

+0

@ jason39481 Jetzt stellst du eine andere Frage ... Ich sehe nicht, wo du sie abschaltest: im '__init__' du ' re Einstellung: 'self.state = False', was sich auf die gesamte 'Schalttafel' bezieht - nicht auf einen bestimmten Schalter. – alfasin

0

Auch der Grund, dass es 1 als wahr druckt, ist, weil von allen Elemente in der Liste, es sieht nur alles als falsch und 1 als wahr (wie in 0 == False, 1 == True).

0

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:

+1

Vergleich, nicht Zuordnung. – Nf4r

+1

Ich denke, du meinst 'self.state = not self.state'. – anonymoose

+0

nett: 'self.state = nicht self.state' ==' self.state^= self.state' –