Python类中calories方法无法访问实例属性,求正确实现方案
问题分析与解决
核心错误
calories未作为类的方法定义:你写的calories()是独立函数,不属于User类,根本无法访问实例的属性;而且你用User.calories()直接调用类的方法,但这个函数既不是实例方法也不是类方法,调用逻辑完全错误。- 属性访问逻辑错误:
self只能在类的实例方法中使用,且方法必须把self作为第一个参数;User.sex是访问类属性,但你定义的sex是实例属性(在__init__中赋值给self),类本身没有这个属性;super.sex属于误用,super()是继承场景下调用父类方法/属性的工具,不能用来直接访问当前实例的属性。
正确实现方案
方案1:将calories封装为User类的实例方法
把函数放到User类内部,第一个参数用self,这样就能直接访问实例的所有属性:
class User: def __init__(self, name, age, weight, height, sex): self.name = name self.age = age self.weight = weight self.height = height self.sex = sex def calories(self): if self.sex == "Man": # 男性基础代谢计算公式 kcal = 10 * self.weight + 6.26 * self.height - 5 * self.age + 5 else: # 女性基础代谢计算公式 kcal = 655 + 9.6 * self.weight + 1.8 * self.height - 4.7 * self.age return round(kcal, 2)
调用时必须用实例对象调用,而不是直接调用类:
user = get_user() # 假设get_user()返回User类的实例 print(user) kcal = user.calories() # 用实例调用calories方法 print(kcal)
关于你提到的def calories(object):写法
这种写法本质是把calories作为独立工具函数,需要传入User实例作为参数,语法上是可行的,但不符合面向对象的封装思想(计算用户的热量消耗属于用户对象的行为,应该封装在类内部)。如果非要用这种方式,调用时必须传入实例:
def calories(user_obj): if user_obj.sex == "Man": kcal = 10 * user_obj.weight + 6.26 * user_obj.height - 5 * user_obj.age + 5 else: kcal = 655 + 9.6 * user_obj.weight + 1.8 * user_obj.height - 4.7 * user_obj.age return round(kcal, 2) # 调用示例 user = get_user() kcal = calories(user)
但更推荐使用方案1的类方法封装,代码结构更清晰、符合面向对象设计原则。
内容的提问来源于stack exchange,提问作者Mateusz Plsz
相关产品推荐
相关产品推荐

