我的简化代码如下:它创建一个动物,并将其放置在动物园内。我想打印动物园里的动物名单。用这个围成一圈!
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()
答案 0 :(得分:2)
向Animal添加的__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()
答案 1 :(得分:1)
您可以在name
中简单地引用Animal
的{{1}}属性,例如:
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)
班负责自己的字符串演示时
就像一个注释:你可能应该在Zoo之外创建Animal实例,如果你决定创建一个具有不同行为的Animal
s(例如Animal
)的类层次结构会发生什么,你的{{1 } class只会知道Mammal
s。
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()