Python函数传字符串参数失效:未使用传入值而是形参名
问题排查与解决方案
嘿,作为Python新手遇到这种属性访问的坑太正常了,我来帮你一步步搞定!
核心问题:错误的属性访问逻辑
你在sortering函数里的lambda表达式写了x.attribut,这就是问题的关键!当你这么写的时候,Python会默认去获取x对象名为attribut的属性,但你的Djur类根本没有这个属性——你传的参数attribut是字符串(比如'age'),但Python不知道要把它当成属性名来解析。
解决这个问题的正确姿势是用Python内置的getattr()函数,它可以接收对象和属性名字符串,返回对应的属性值。修改后的sortering函数如下:
def sortering(attribut): try: val1 = input("Vill du sortera stigande eller fallande? s/f") if val1 == "s": djurlista.sort(key=lambda x: getattr(x, attribut)) print(*djurlista, sep='\n \n') elif val1 == "f": djurlista.sort(key=lambda x: getattr(x, attribut), reverse=True) print(*djurlista, sep='\n \n') else: # 补充非s/f输入的提示,比只靠except更全面 print("Svara med s för stigande eller f för fallande!") except AttributeError: # 捕获传入不存在属性名的情况 print(f"Fel: Djurobjekt har ingen egenskap med namnet '{attribut}'!")
另外两个必须修复的bug
除了排序的核心问题,你的代码还有两个会直接导致崩溃的问题:
1. 函数调用时机错误
你把sortering('age')写在了Djur类定义的前面,这时候Djur类还没被定义,djurlista也没有正确初始化,运行时会直接报错。必须把函数调用移到所有类定义和列表初始化之后。
2. __init__方法的无限递归
在Djur的__init__里,你写了:
x = Djur(art, namn, ålder, kön, gravid) self.djurlista.append(x)
这会触发无限递归!因为每次创建Djur对象时,__init__会被调用,然后又创建一个新的Djur对象,循环往复直到内存溢出。
正确的做法是把djurlista作为全局列表(或者在类外维护),在创建Djur对象时直接把当前对象添加到列表里,而不是在__init__内部新建对象。比如:
# 先初始化全局的动物列表 djurlista = [] class Djur: def __init__(self, art, namn, ålder, kön, gravid): self.art = art self.namn = namn self.age = ålder self.gender = kön self.gravid = gravid # 直接把当前对象添加到全局列表,避免递归 djurlista.append(self) def __str__(self): return (f"Art: {self.art}\nNamn: {self.namn}\nÅlder: {self.age}\nKön: {self.gender}\nGravid: {self.gravid}") def __repr__(self): return str(self) # 先创建几个测试用的动物对象 Djur("Hund", "Fido", 5, "Hane", False) Djur("Katt", "Maja", 3, "Hona", True) Djur("Hamster", "Nalle", 1, "Hane", False) # 最后调用排序函数 sortering('age')
测试验证
现在运行修改后的代码,当你输入s或者f时,程序会根据你传入的属性名(比如'age')正确排序djurlista里的动物对象啦!
内容的提问来源于stack exchange,提问作者Lajen
相关产品推荐
相关产品推荐

