Вы можете просто сослаться на 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)
' '' .join (animal.name для животных в self.animals)' ' – AChampion
@AlG животных (название) 'в' Zoo.add() 'создает животное - не особенно чистое. – AChampion
Наверное, не самый чистый, но я новичок в Python. Можете ли вы предложить более чистый способ сделать это? – pasta1020