我必须制作一个允许用户输入信息并根据该信息打印出一些文本的动物类。
class Animal:
def __init__(self,species='default',language='default',age=0):
self.species=species
self.language=language
self.age=age
def setSpecies(self, species):
#set animal species
self.species=species
def setLanguage(self, language):
#set animal language
self.language=language
def setAge(self, age):
#set animal age
self.age=age
def speak(self):
#prints a sentance by the animal
print('I am a {} year old {} and I {}.'.format(self.age, self.species, self.language))
def __repr__(self):
#return string representation
return "Animal,'{}','{}',{}".format(self.species,self.language,self.age)
def __eq__(self, new):
#compares animals
return self.species==new.species and self.language==new.language and self.age==new.age
现在我必须编写一个函数processAnimals(),它接受一个参数,即输入文件的名称。如果文件不包含任何行,则该函数返回创建的动物列表或空列表。 processAnimals()函数应该读取文件中的所有行,为每一行创建一个Animal对象并将该对象放入一个列表中。
def processAnimals(fname):
with open(fname,'r') as f:
for line in f:
line = fname.strip().split(',')
print('I am a {} year old {} and i {}.').format(self.species,self.language,self.age)
我收到此错误:AttributeError: 'NoneType' object has no attribute 'format'
当我删除.format(self.species,self.language,self.age)
时,它会打印
I am a {} year old {} and i {}.
I am a {} year old {} and i {}.
I am a {} year old {} and i {}.
这是我需要的,但{}
应该包含文件中的信息
文字档案:
cat,meow,8
dog,bark,22
bat,use sonar,2
我认为我的问题可能是阅读文件,但我并不确定。
答案 0 :(得分:1)
这里有一些问题:
您正在使用fname
迭代打开的文件for line in f
。然后,您立即执行line = fname.strip().split(',')
,根据line
- 文件名重新定义fname
。您想要分割line
,而不是fname
。
你正在做print('something').format(else)
。您正在format
对象上调用print()
方法。 print()
函数不返回任何内容,因此调用format
等同于None.format()
,这显然无效。您想在字符串上调用format
,而不是print
函数。所以print('something'.format(else))
而不是print('something').format(else)
您在self.species, self.language, self.age
内使用processAnimals
。除非processAnimals
是Animals
的类方法,并且我猜它不是因为它的唯一参数是fname
,所以没有self
对象来调用方法。在调用方法之前,您需要为每一行实例化Animals
类。
你可以这样做:
def processAnimals(fname):
with open(fname, 'r') as f:
for line in f:
new_animal = Animal(*(line.strip().split(',')))
print('I am a {} year old {} and i {}.'.format(new_animal.species, new_animal.language, new_animal.age))