当我尝试使用的属性时(请参见下面的代码),我收到一条错误消息,指出该对象没有属性,例如名称。 hasattr('a','name')输出false。我希望能够例如在方法display_info中使用属性名称,但是看来我的对象没有给定的任何属性。同时,find_by_attribute方法可以正常工作,并输出具有给定属性的对象,我对此感到困惑。也许我以错误的方式创建对象?
尝试使用say_hi方法时,会出现相同的错误。
@dataclass
class Animal:
name: str
species: str
gender: str
age: int
mood: str
@classmethod
def say_hi(self):
print(f'{self.name} the {self.species} says hi!')
def display_info(self):
print('Name:',self.name)
print('Species:',self.species)
print('Gender:',self.gender)
print('Age: %d' % self.age)
print('Mood:',self.mood)
class Zoo:
def __init__(self):
self.animals = []
def add_animal(self):
print('Adding a new animal to the zoo:')
name = input('What is it\'s name? ')
species = input('What species is it? ')
gender = input('What gender is it? ')
age = int(input('What age is it? '))
mood = input('How is the animal feeling? ')
a = Animal(name, species, gender, age, mood)
self.animals.append(a)
def find_by_attribute(self, attribute_name, value):
return [a for a in self.animals if getattr(a, attribute_name) == value]
a = Zoo()
a.add_animal()
答案 0 :(得分:2)
好吧,最后一行的a
与a
方法中的add_animal
不同:
Zoo
的实例,它没有任何称为name
的属性,但是有一系列动物,其中每个动物都分配了属性。a
可能使您感到困惑,这是方法内部的局部变量,已添加到animals
实例的Zoo
列表中。因此,如果要访问名称属性,则需要在实例animals
内的a
列表的元素上调用它,如下所示:
a = Zoo()
a.add_animal() # answer the inputs ...
print(hasattr(a.animals[0], 'name') # => True
我建议不要在类/方法的内部和外部使用相同的变量名,以消除任何混淆。
希望这会有所帮助
编辑(在评论中回答问题:例如,我将如何修改display_info以返回给定动物的动物属性?)
您不需要方法display_info
,因为Animal
是dataclass,您可以打印它:
# continuation for code from before
for animal in a.animals:
print(animal)
输出类似:
Animal(name='tiger', species='cat', gender='male', age=12, mood='hungry')
如果要将信息存储在字符串中以备后用,则可以:
animal_info = str(a.animals[0])
如果您要打印特定的动物,只说12岁,您可以:
print([animal for animal in a.animals if animal.age == 12])
这将显示想要的动物列表。