2016-11-09 195 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

' ''。加入(animal.name在self.animals动物)' – AChampion

+0

@AlG'动物(名)'在'Zoo.add()'中创建动物 - 不是特别干净。 – AChampion

+0

可能不是最干净的,但我是Python的新手。你能建议一个更干净的方式吗? – pasta1020

回答

0

你可以简单地指的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类负责其自己的字符串表现。
正如注意:您可能应该在Zoo外部创建Animal实例,如果您决定创建具有不同行为的Animal s(例如Mammal)的类层次结构,您的Zoo类只知道Animal s会发生什么情况。

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)。在Zoo.__str__(),例如:

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()'在对象中寻找'__str __()'或'__repr __()'到'print',所以'print(zoo.animals)'会起作用,但是因为'str.join()'没有, 'print(动物园)'会引发'TypeError'。另外,'__str __()'可能是更正确的实现方法,'__repr __()'旨在重建类型,所以通常会打印出类名。 'Animal .__ repr __(self):return'Animal('+ self.name +')'' – AChampion