You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类中calories方法无法访问实例属性,求正确实现方案

问题分析与解决

核心错误

  1. calories未作为类的方法定义:你写的calories()是独立函数,不属于User类,根本无法访问实例的属性;而且你用User.calories()直接调用类的方法,但这个函数既不是实例方法也不是类方法,调用逻辑完全错误。
  2. 属性访问逻辑错误:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:35:19