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

Python Polynomial类@property装饰器失效问题求助

嘿,我帮你找到了问题的根源——完全是代码缩进错误导致的,和Spyder IDE没有任何关系!Python是严格依赖缩进区分代码块的语言,你的类方法根本没被正确定义在Polynomial类内部,自然无法触发property的getter/setter逻辑。下面是具体的诊断和修复方案:

问题诊断与修复

1. 核心问题:缩进错误

你的原始代码中,__init__、@property装饰的coefficients及其setter/deleter方法,都和class Polynomial():处于同一缩进层级——这会导致这些方法被定义成全局函数,而不是类的成员方法。当你实例化对象或访问coefficients时,Python只会处理普通的实例属性,完全不会触发你写的property逻辑。

2. 修正后的完整代码

我帮你调整了缩进,同时修复了order属性的访问问题:

import numpy as np

class Polynomial():
    __coefficients = None
    
    def __init__(self, coeffs):
        self.coefficients = coeffs  # 现在会触发setter
    
    # INTERFACES FOR ATTRIBUTE : __coefficients
    @property
    def coefficients(self):
        print('getting coefficients')
        return self.__coefficients
    
    @coefficients.setter
    def coefficients(self, coeffs):
        print('setting coefficients')
        self.__coefficients = np.array(coeffs)
        # 注:多项式阶数通常是最高次项的次数(比如[0,0,1]是二次多项式),所以用size-1更合理
        self.__order = self.__coefficients.size - 1
    
    @coefficients.deleter
    def coefficients(self):
        del self.__coefficients
    
    # 为order属性添加getter,让外部可以访问
    @property
    def order(self):
        return self.__order

3. 关于order属性的补充说明

你之前定义的self.__order是私有实例变量(双下划线开头),Python会对这类名称做自动修饰(变成_Polynomial__order),外部无法直接通过fx.order访问。要让外部能正常获取阶数,必须为它添加对应的@property装饰器,就像coefficients那样。

4. 验证修复效果

运行修正后的代码,你会看到预期的输出:

fx = Polynomial([0,0,1])
# 会打印:setting coefficients

print(fx.coefficients)
# 先打印:getting coefficients
# 再输出:[0 0 1]

print(fx.order)
# 输出:2(对应二次多项式的阶数)

关于Spyder的疑问

Spyder本身不会导致这个问题——任何Python环境下,缩进错误都会让类方法定义失效。你可以在命令行Python、PyCharm等其他环境测试,结果都是一致的,问题完全出在代码本身的缩进上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:28:11