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

使用Python property重命名方法时触发NameError错误求助

问题解决:Python property函数使用错误修复

错误原因

  • 直接写calcolaCalorie时,Python在全局作用域找不到这个方法——它是父类Cibo的成员方法,不属于全局函数。
  • property(calcolaCalorie(self))写法完全错误:property需要接收方法对象,而非调用方法后的返回值,且类外部不存在self这个实例对象。

正确实现方式

方式一:类内部定义property(推荐)

在类里直接用property()函数或装饰器将方法转为属性,符合Python类设计习惯:

class Cibo:
    """un esempio di classe per gestire cibi"""
    def __init__(self, proteine = 0, carboidrati = 0, grassi = 0):
        self.proteine = proteine
        self.carboidrati = carboidrati
        self.grassi = grassi

    def calcolaCalorie(self):
        return (self.proteine*4 + self.carboidrati*4 + self.grassi*9)

    # 将方法转为属性
    calorie = property(calcolaCalorie)


class Verdura(Cibo):
    def __init__(self, proteine=0, carboidrati=0):
        super().__init__(proteine, carboidrati, grassi=0)  # 推荐用super()调用父类构造

# 测试
carota = Verdura(proteine=1, carboidrati=9)
print(carota.calorie)  # 无需加括号,直接访问

方式二:类外部添加property(若需此操作)

需正确引用父类的方法,因为calcolaCalorie属于Cibo类:

class Cibo:
    """un esempio di classe per gestire cibi"""
    def __init__(self, proteine = 0, carboidrati = 0, grassi = 0):
        self.proteine = proteine
        self.carboidrati = carboidrati
        self.grassi = grassi

    def calcolaCalorie(self):
        return (self.proteine*4 + self.carboidrati*4 + self.grassi*9)


class Verdura(Cibo):
    def __init__(self, proteine=0, carboidrati=0):
        Cibo.__init__(self, proteine, carboidrati, grassi=0)

# 正确引用父类方法添加property
Verdura.calorie = property(Cibo.calcolaCalorie)

# 测试
spinaci = Verdura(proteine=2, carboidrati=3)
print(spinaci.calorie)  # 输出 2*4 +3*4 +0*9 = 20

额外提示

  • 用super().__init__()代替直接调用Cibo.__init__(self),在多继承场景下更灵活。
  • property还支持定义setter和deleter方法,实现属性的读写控制:
class Cibo:
    # ... 其他代码 ...
    @property
    def calorie(self):
        return (self.proteine*4 + self.carboidrati*4 + self.grassi*9)
    
    @calorie.setter
    def calorie(self, value):
        # 示例:根据总热量反推营养成分
        self.grassi = value //9
        remaining = value %9
        self.proteine = remaining //8
        self.carboidrati = remaining %8

内容的提问来源于stack exchange,提问作者tiagh3tto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:01