2016-11-09 9 views
0

以下の簡略化されたコード - 動物を作成し、動物園の中に配置します。私は動物園内の動物のリストを印刷したい。これでサークルに参加しよう!どんな助けもありがたい。Pythonのクラスからリストを印刷する

class Animal(object): 

    def __init__(self, name): 
     self.name = name 

class Zoo(object): 

    def __init__(self): 
     self.animals = [] 

    def __str__(self): 
     rep = ", ".join(self.animals) 
     return rep 

    def add(self, name): 
     self.animals.append(Animal(name)) 

def main(): 

    while True: 
     zoo = Zoo() 
     animal = input("add an animal: ") 
     zoo.add(animal) 
     print(zoo) 

main() 
+3

' '' .join(self.animals動物用animal.name)' – AChampion

+0

@AlG '動物を(名前) '' '' Zoo.add() 'は動物を作ります。 – AChampion

+0

おそらく最もクリーンではありませんが、私はPythonを初めて使っています。あなたはよりクリーンな方法を提案できますか? – pasta1020

答えて

0

あなたは単に例えば、あなたのZoo.__str__()Animalnameプロパティを参照することができます。:

def __str__(self): 
    return ', '.join(animal.name for animal in self.animals) 

print(zoo)正常に動作するはずです。

しかし、これは、動物を印刷することを意味するものを変更したいと言うと、カプセル化があまり行われません。等の高さ、大きさ、だから、おそらくよりカプセル化された形態は、次のようになります。

class Animal(object): 
    ... 
    def __str__(self): 
     return self.name 

class Zoo(object): 
    ... 
    def __str__(self): 
     return ", ".join(str(animal) for animal in self.animals) 

print(zoo)Animalクラスは、独自の文字列プレゼンテーションを担当していたとき。
動物園以外の動物園のインスタンスを作成する必要があります。Animal(例:Mammal)のクラス階層を作成して異なる動作をする場合、Zooクラスは約Animalしか知らないでしょう。あなたはMammalクラス作成する場合はこれがまだ適切に振る舞う

class Animal(object): 
    def __init__(self, name): 
     self.name = name 
    def __str__(self): 
     return self.name 

class Zoo(object): 
    def __init__(self): 
     self.animals = [] 
    def __str__(self): 
     return ", ".join(str(animal) for animal in self.animals) 
    def add(self, animal): 
     self.animals.append(animal) 

def main(): 
    zoo = Zoo() 
    while True: 
     animal = Animal(input("add an animal: ")) 
     zoo.add(animal) 
     print(zoo) 

main() 

class Mammal(Animal): 
    ... 

zoo.add(Mammal(...)) 
print(zoo) 
+0

これは本当に有益です。 – pasta1020

2

追加された__repr__メソッドは動物に私たちを返します。

zoo = Zoo()はループの外側になければなりません。これは、すべての反復で新しい動物園を作成しないことを保証します。

次に、リスト(zoo.animals)を印刷します。

class Animal(object): 
    def __init__(self, name): 
     self.name = name 
    def __repr__(self): 
     return self.name 



class Zoo(object): 
    def __init__(self): 
     self.animals = [] 
    def __str__(self): 
     rep = ", ".join(self.animals) 
     return rep 
    def add(self, name): 
     self.animals.append(Animal(name)) 



def main(): 
    zoo = Zoo() 
    while True: 
     animal = input("add an animal: ") 
     zoo.add(animal) 
     print(zoo.animals) 


main() 
+0

いくつかの説明が役に立ちます。 –

+0

これは 'print(zoo)'には機能しません。 'print()'は 'print'へのオブジェクトで' __str __() 'や' __repr __() 'を探します。' print(zoo.animals) 'は動作しますが、' str.join() 'print(zoo)'は 'TypeError'を送出します。さらに、 '__str __()'は実装する方が正しいでしょう。 '__repr __()'は型を再構築できるように意図されているので、通常はクラス名を表示します。 'Animal .__ repr __(self):return 'Animal(' + self.name + ')' – AChampion

関連する問題