2016-11-09 2 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 (animal.name для животных в self.animals)' ' – AChampion

+0

@AlG животных (название) 'в' Zoo.add() 'создает животное - не особенно чистое. – AChampion

+0

Наверное, не самый чистый, но я новичок в Python. Можете ли вы предложить более чистый способ сделать это? – pasta1020

ответ

0

Вы можете просто сослаться на name свойство Animal в вашем Zoo.__str__(), например .:

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 с.

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() 

Это будет по-прежнему вести себя должным образом, если вы создаете Mammal класс:

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()' ищет '__str __()' или '__repr __()' в объектах 'print', поэтому' print (zoo.animals) 'будет работать, но поскольку' str.join() 'does not, 'print (zoo)' будет поднять 'TypeError'. Кроме того, '__str __()', вероятно, является более правильным способом реализации, '__repr __()' предназначен для восстановления типа, поэтому обычно печатается имя класса, например. 'Animal .__ repr __ (self): return 'Animal (' + self.name + ')'' – AChampion

Смежные вопросы