2017-11-21 1 views
-1

Es gibt eine Leiter. Auf der 3. Sprosse der Leiter ist ein Affe, die 5. Sprosse hat ein Eichhörnchen, die 8. Sprosse hat eine Taube, die 15. Sprosse hat einen Adler, die 17. Sprosse hat einen anderen Affen.Ich lerne Objekte und Klassen in Python und ich habe versucht, ein Programm zu schreiben, das mich Druckfunktionen von Tieren auf verschiedenen Leitersprossen erfordert

Der Affe hat 2 Augen, 2 Hände, 2 Beine. Das Eichhörnchen hat 2 Augen, 4 Beine. Die Taube hat 2 Augen, 2 Flügel, 2 Beine und kann fliegen. Der Adler hat 2 Augen, 2 Flügel, 2 Beine und kann fliegen.

Ich habe den Code in zwei Module Leiter-Benutzer und ladderutils

ladder-user.py Um Tier Merkmale

from ladderutils import ladder 

    l = ladder() 
    print (l.animal_at_rung(3)) 
    print (l.animal_at_rung(5)) 
    print (l.animal_at_rung(8)) 
    print (l.animal_at_rung(15)) 
    print (l.animal_at_rung(10)) 
    print (l.get_animals_count()) 
    print (l.animal_at_rung(3) == l.animal_at_rung(17)) 
    print (type(l.animal_at_rung(3)) == type(l.animal_at_rung(17))) 
    print (l.animal_at_rung(8).fly()) 
    print (l.animal_at_rung(3).fly()) 
    print (l.hop(3)) 
    print (l.animal_at_rung(3)) 
    print (l.animal_at_rung(4)) 
    print (l.hop(4)) 
    print (l.animal_at_rung(4)) 

ladderutils.py

class Animal(object): 
    features= {} 

    def __init__(self,eyes,legs,hands,wings,fly): 
    self.features['eyes'] = eyes 
    self.features['legs'] = legs 
    self.features['hands'] = hands 
    self.features['wings'] = wings 
    self.features['fly'] = fly 

    def fly(self): 
    return self.features['fly'] 

class Monkey(Animal): 

    def __init__(self,eyes,legs,hands): 
    self.name = 'Monkey' 
    Animal.__init__(self,eyes,legs,hands,0,False) 

    def __repr__(self): 
    temp = {} 
    for key in self.features: 
     if(self.features[key]>0 and self.features[key]!=False): 
      temp[key] = self.features[key] 
    return str({self.name:temp}) 

class Squirrel(Animal): 

    def __init__(self,eyes,legs): 
    self.name = 'Squirrel' 
    Animal.__init__(self,eyes,legs,0,0,False)   

    def __repr__(self): 
    temp = {} 
    for key in self.features: 
     if(self.features[key]>0 or self.features[key]!=False): 
      temp[key] = self.features[key] 
    return str({self.name:temp}) 

class Pigeon(Animal): 

    def __init__(self,eyes,legs,wings): 
    self.name = 'Pigeon' 
    Animal.__init__(self,eyes,legs,0,wings,True) 

    def __repr__(self): 
    print(self.features) 
    temp = {} 
    for key in self.features: 
     if(self.features[key]>0 or self.features[key]==True): 
      temp[key] = self.features[key] 
    return str({self.name:temp}) 

class Eagle(Animal): 

    def __init__(self,eyes,legs,wings): 
    self.name = 'Eagle' 
    Animal.__init__(self,eyes,legs,0,wings,True) 

    def __repr__(self): 
    temp = {} 
    for key in self.features: 
     if(self.features[key]!=0 and self.features[key]!=False): 
      temp[key] = self.features[key] 
    return str({self.name:temp}) 

class ladder: 
    ladder_pos = {} 


    def __init__(self): 
    self.ladder_pos['3'] = Monkey(2,2,2) 
    self.ladder_pos['5'] = Squirrel(2,4) 
    self.ladder_pos['8'] = Pigeon(2,2,2) 
    self.ladder_pos['15'] = Eagle(2,2,2) 
    self.ladder_pos['17'] = Monkey(2,2,2) 

    def animal_at_rung(self,pos): 
    if(str(pos) in self.ladder_pos): 
     return self.ladder_pos[str(pos)] 
    else: 
     return ('None') 

    def get_animals_count(self): 
    return len(self.ladder_pos) 

    def hop(self,pos): 
    if(str(pos+1) in self.ladder_pos): 
     return ("Not Empty") 
    else: 
     self.ladder_pos[str(pos+1)] = self.ladder_pos[str(pos)] 
     del self.ladder_pos[str(pos)] 
     return ('None') 

Meine Ausgabe zu drucken geteilt ist

{'Monkey': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 
{'Squirrel': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 
{'hands': 0, 'legs': 2, 'fly': True, 'wings': 2, 'eyes': 2} 
{'Piegon': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 
{'Eagle': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 
None 
4 
False 
False 
True 
True 
None 
None 
{'Monkey': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 
Not Empty 
{'Monkey': {'legs': 2, 'wings': 2, 'fly': True, 'eyes': 2}} 

Aber soll ich

Monkey <eyes: 2, legs: 2, hands: 2> 
Squirrel <eyes: 2, legs: 4> 
Pigeon <fly: True, eyes: 2, legs: 2, wings: 2> 
Eagle <fly: True, eyes: 2, legs: 2, wings: 2> 
None 
5 
False 
True 
True 
False 
None 
None 
Monkey <eyes: 2, legs: 2, hands: 2> 
Not empty 
Monkey <eyes: 2, legs: 2, hands: 2> 

Antwort

1

Hier erhalten:

class Animal(object): 
    features= {} 

    def __init__(self,eyes,legs,hands,wings,fly): 
    self.features['eyes'] = eyes 
    self.features['legs'] = legs 
    self.features['hands'] = hands 
    self.features['wings'] = wings 
    self.features['fly'] = fly 

features ist ein Klasse-Attribut, das unter allen Instanzen Animal geteilt wird. Jedes Mal, wenn Sie Animal (oder eine Unterklasse von) instanziieren, überschreiben Sie die Werte, die von der vorherigen Instanz festgelegt wurden. Was Sie wollen, ist features eine Instanz machen Attribut statt:

class Animal(object): 

    def __init__(self,eyes,legs,hands,wings,fly): 
    self.features = { 
     'eyes': eyes, 
     'legs': legs, 
     'hands': hands, 
     'wings': wings, 
     'fly': fly 
     } 

Auch Sie die __repr__ Methode in jeder und jede Unterklasse kopieren kleistert, während Sie es einfach in Animal definieren konnte - und man könnte es tatsächlich vereinfachen ziemlich Bit:

class Animal(object): 
    def __init__(self,eyes,legs,hands,wings,fly): 
    self.features = { 
     'eyes': eyes, 
     'legs': legs, 
     'hands': hands, 
     'wings': wings, 
     'fly': fly 
     } 

    def __repr__(self): 
     temp = ", ".join(
      "{}: {}".format(k, v) 
      for k, v in self.features.items() if v 
      ) 
     return "{} <{}>".format(self.name, temp) 

es gibt ein paar andere Fragen - eine andere Klasse Attribut in der ladder Klasse (die Ladder nach Python Namenskonventionen benannt werden soll), Streicher Tasten in ladder.ladder_pos mit dann in Methoden auf ihn wirkenden ganze Zahlen mit argume nts und wandeln sie immer wieder in Strings um (Hinweis: Sie könnten Integer einfach als Schlüssel verwenden) etc ..., aber diese sollten nicht verhindern, dass Ihr Code die erwarteten Ausgaben erzeugt.

+0

Vielen Dank. Es hat mein Verständnis des Themas erhöht. –

+0

@AjaySingh froh, ich könnte helfen. Und fühlen Sie sich frei, zu antworten und/oder die Antwort zu akzeptieren, wenn es Ihr Problem gelöst hat;) –

Verwandte Themen