使用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
相关产品推荐
相关产品推荐

