Python OOP问题:如何从列表获取对象并调用其属性?
嘿,刚接触Python和面向对象编程(OOP)的话,遇到这个问题太正常了,我来帮你一步步理清~
问题根源
你现在的核心问题是:列表animals里存储的是对象名称的字符串(比如'recluse'),而不是你实际创建的creature类实例(也就是recluse这个变量对应的对象)。
当你把字符串传给checkLegs函数时,函数尝试访问这个字符串的legs属性,但字符串本身根本没有这个属性,所以就触发了AttributeError: 'str' object has no attribute 'legs'这个错误。
修正方案
这里给你两种常用的解决思路:
方案1:直接在列表中存储对象实例
这是最直观的方法,把列表里的字符串替换成你已经创建好的creature对象:
class creature(): def __init__(self, name, legs): self.name = name self.legs = legs rat = creature("rat",4) mouse = creature("mouse",4) beaver = creature("beaver",4) squirrel = creature("squirrel",4) chimpanzee = creature("chimpanzee",2) gorilla = creature("gorilla",2) orangutan = creature("orangutan",2) spider_monkey = creature("spider_monkey",2) black_widow = creature("black_widow",8) recluse = creature("recluse",8) wolf_spider = creature("wolf_spider",8) daddy_long_leg = creature("daddy_long_leg",8) def checkLegs(critter): nbrLegs = critter.legs return nbrLegs # 这里要返回nbrLegs,你原来的success未定义 # 替换成存储对象实例的列表 animals = [ [rat, mouse, beaver, squirrel], [chimpanzee, gorilla, orangutan, spider_monkey], [black_widow, recluse, wolf_spider, daddy_long_leg] ] # 测试:从列表中取对象传入函数 numberOfLegs = checkLegs(animals[2][1]) # 取recluse对象 print("The Recluse has: ") print(numberOfLegs) print(" legs")
方案2:用字典映射字符串到对象
如果你需要保留对象名称的字符串(比如要显示名称),可以创建一个字典,把字符串和对应的对象关联起来:
# 先创建对象映射字典 animal_dict = { 'rat': rat, 'mouse': mouse, 'beaver': beaver, 'squirrel': squirrel, 'chimpanzee': chimpanzee, 'gorilla': gorilla, 'orangutan': orangutan, 'spider_monkey': spider_monkey, 'black_widow': black_widow, 'recluse': recluse, 'wolf_spider': wolf_spider, 'daddy_long_leg': daddy_long_leg } # 通过字符串获取对象,再传入函数 test_animal_name = 'recluse' numberOfLegs = checkLegs(animal_dict[test_animal_name]) print(f"The {test_animal_name.title()} has: {numberOfLegs} legs")
额外小修正
你的checkLegs函数里原来的return success是错误的,因为success这个变量根本没定义,应该改成返回nbrLegs,这样函数才能返回正确的腿数。
你遇到的错误信息
The test animal is: orangutan
Traceback (most recent call last):
File "/Python37/help.py", line 32, in
numberOfLegs = checkLegs(testAnimal)
File "Python37/help.py", line 20, in checkLegs
nbrLegs = critter.legs
AttributeError: 'str' object has no attribute 'legs'
内容的提问来源于stack exchange,提问作者scorp

