对象比较方法实现问题:两类实例数值比较失效求助
排查与解决方案:类方法返回值无法比较的问题
首先,你的代码逻辑本身是通顺的,但没法正常比较数值,大概率是类的方法没有返回正确的数值类型,甚至可能根本没返回值。咱们一步步来排查和解决:
第一步:先确认方法的返回值
你可以在赋值后加几行打印,看看变量的类型和具体内容,这是最快定位问题的方式:
cm1=pi.avg_ghad1() cm2=pu.avg_ghad2() # 打印类型和值,确认问题 print("cm1类型:", type(cm1), "值:", cm1) print("cm2类型:", type(cm2), "值:", cm2)
常见的问题有这几种:
- 方法没写
return语句:Python里没return的方法默认返回None,两个None比较永远相等,自然不符合你的预期。 - 返回的是带单位的字符串(比如
"180cm"):字符串之间的比较是按字符顺序,不是数值大小,结果肯定不对。 - 返回的是自定义对象:比如方法返回了类的实例,直接比较对象会对比内存地址,不是你要的数值。
针对不同问题的解决办法
1. 方法没有返回值:补全return语句
比如你的avg_ghad1()可能是这样的(漏掉了return):
class YourClass: def avg_ghad1(self): # 计算平均值的逻辑 total = sum(self.ghad_data) avg = total / len(self.ghad_data) # 这里没写return!
修改成这样,确保返回计算后的数值:
class YourClass: def avg_ghad1(self): # 记得处理空列表,避免除以0错误 if not self.ghad_data: return 0.0 # 或者根据业务需求返回默认值 total = sum(self.ghad_data) avg = total / len(self.ghad_data) return avg # 必须返回计算结果
2. 返回的是带单位的字符串:提取数值
如果方法返回的是类似"175cm"的字符串,需要先提取数字部分:
cm1 = float(pi.avg_ghad1().replace("cm", "").strip()) cm2 = float(pu.avg_ghad2().replace("cm", "").strip())
如果单位不固定,也可以用正则提取数字:
import re cm1 = float(re.findall(r'\d+\.?\d*', pi.avg_ghad1())[0])
3. 返回的是自定义对象:获取数值属性
如果avg_ghad1()返回的是一个自定义的测量对象(比如包含value和unit属性),那要直接取数值属性:
cm1 = pi.avg_ghad1().value cm2 = pu.avg_ghad2().value
优化后的完整代码示例
假设你的类已经能正确返回数值类型,整理后的代码会更清晰易维护:
# 定义正确的类(示例) class Person: def __init__(self, height_records, weight_records): self.height_records = height_records self.weight_records = weight_records # 计算平均身高,返回数值 def avg_ghad(self): if not self.height_records: return 0.0 return sum(self.height_records) / len(self.height_records) # 计算平均体重,返回数值 def avg_vazn(self): if not self.weight_records: return 0.0 return sum(self.weight_records) / len(self.weight_records) # 实例化两个对象 pi = Person([180, 179], [75, 76]) pu = Person([178, 177], [78, 79]) # 获取数值 cm1 = pi.avg_ghad() heavy1 = pi.avg_vazn() cm2 = pu.avg_ghad() heavy2 = pu.avg_vazn() # 执行比较逻辑 if cm1 > cm2: print('A') elif cm1 < cm2: print('B') else: if heavy1 < heavy2: print("A") elif heavy1 > heavy2: print("B") else: print("same")
先按第一步的排查方法确认问题出在哪,再对应修改就能解决啦。
内容的提问来源于stack exchange,提问作者saeed khalilian
相关产品推荐
相关产品推荐

