Python 对象不包含给定的属性

Python 对象不包含给定的属性,python,python-3.x,Python,Python 3.x,当我试图使用一个对象的属性时(见下面的代码),我得到一个错误,说该对象没有属性,例如name。hasattr('a','name')输出false。例如,我希望能够在方法display_info中使用属性名,但我的对象似乎没有任何给定的属性。同时,方法find_by_attribute运行良好,并输出具有给定属性的对象,我在这里感到困惑。也许我用错误的方式创建了我的对象 当尝试使用say_hi方法时,会出现相同的错误 @dataclass class Animal: name: str

当我试图使用一个对象的属性时(见下面的代码),我得到一个错误,说该对象没有属性,例如name。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()

最后一行的
a
a
中的
add\u animal
方法不同:

  • 第一个是
    Zoo
    的实例,它没有任何名为
    name
    的属性,但它有一个动物列表,每个动物都有指定的属性
  • 第二个
    a
    可能让您感到困惑,这是方法内部的一个局部变量,添加到
    Zoo
    实例的
    animals
    列表中
因此,如果要访问name属性,需要在实例
a
animals
列表的元素上调用它,如下所示:

a=Zoo()
a、 添加动物()#回答输入。。。
打印(hasattr(a.animals[0],'name')#=>True
我建议不要在类/方法内外使用相同的变量名,以消除任何混淆

希望这有帮助

编辑(回答评论中的问题:例如,我如何修改显示信息以返回给定动物的动物属性?)

您不需要使用方法
display\u info
,因为
Animal
是一种简单的方法,您只需打印即可:

#以前的代码的延续
对于a中的动物:
印刷品(动物)
输出如下内容:

动物(名称为“老虎”,物种为“猫”,性别为“雄性”,年龄为12岁,情绪为“饥饿”)
如果要将信息存储在字符串中供以后使用,可以:

animal\u info=str(a.animals[0])
如果要打印特定的动物,请只打印年龄为12岁的动物,您可以:

print([animal for animal in a.animals if animal.age==12])

这将显示所需的动物列表。

好的,最后一行的
a
a
内部的
添加动物
方法不同:

  • 第一个是
    Zoo
    的实例,它没有任何名为
    name
    的属性,但它有一个动物列表,每个动物都有指定的属性
  • 第二个
    a
    可能让您感到困惑,这是方法内部的一个局部变量,添加到
    Zoo
    实例的
    animals
    列表中
因此,如果要访问name属性,需要在实例
a
animals
列表的元素上调用它,如下所示:

a=Zoo()
a、 添加动物()#回答输入。。。
打印(hasattr(a.animals[0],'name')#=>True
我建议不要在类/方法内外使用相同的变量名,以消除任何混淆

希望这有帮助

编辑(回答评论中的问题:例如,我如何修改显示信息以返回给定动物的动物属性?)

您不需要使用方法
display\u info
,因为
Animal
是一种简单的方法,您只需打印即可:

#以前的代码的延续
对于a中的动物:
印刷品(动物)
输出如下内容:

动物(名称为“老虎”,物种为“猫”,性别为“雄性”,年龄为12岁,情绪为“饥饿”)
如果要将信息存储在字符串中供以后使用,可以:

animal\u info=str(a.animals[0])
如果要打印特定的动物,请只打印年龄为12岁的动物,您可以:

print([animal for animal in a.animals if animal.age==12])

这将显示所需的动物列表。

hasattr('a','name')
hasattr(a,'name')
不一样。在我看来,这像是一个输入错误。无论哪种方式返回false:(@Hoog,因为它是一个what
a
你在这里传递的东西:
Zoo
Animal
say_hi
不应该是一个类方法;去掉decorator。
hasattr('a','name')
hasattr(a,'name')
不一样。在我看来像是一个输入错误。无论哪种方式返回false:(@Hoog,因为它是一个what
a
你在这里传递的东西:
Zoo
Animal
说“嗨”
不应该是一个类方法;摆脱装饰器。好吧,谢谢你的帮助。那么我该如何修改
显示信息来返回给定动物的动物属性呢?我想使用dataclasses让这对我来说困难了很多。好的,谢谢你的帮助。那么我如何修改
display\u info
以返回给定动物的动物属性呢?我觉得使用dataclasses让这对我来说困难了很多。。