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

Python中super对象提示无in1属性?父类已定义却报错

Python抽象父类@property子类重写报错问题解决

问题场景

抽象父类TLogElement定义了in1属性的抽象@property与setter,但子类TNot重写该属性后,执行赋值操作时触发报错:AttributeError: 'super' object has no attribute 'in1'。

父类代码

from abc import ABC, abstractmethod

class TLogElement(ABC):
    def __init__(self, _in1=None,_in2=None):
        self._in1 = _in1
        self._in2 = _in2

    @property
    @abstractmethod
    def in1(self):
        return self._in1

    @in1.setter
    @abstractmethod
    def in1(self, _in1):
        self._in1 = _in1

子类代码

class TNot (TLogElement):
    def __init__(self, _in1=None, _in2=None):
        super().__init__(_in1)

    @property
    def in1(self):
        return super().in1

    @in1.setter
    def in1(self, _in1):
        super().in1 = _in1

触发报错的执行代码

T = TNot()
T.in1 = 5

报错信息

AttributeError: 'super' object has no attribute 'in1'

问题原因

父类中in1的@property与setter都被标记为@abstractmethod,这意味着父类仅定义了属性的接口规范,并未提供可执行的具体实现逻辑。当子类通过super().in1尝试访问父类属性时,super对象无法找到对应的具体实现,因此抛出属性不存在的错误。

另外,super().in1 = _in1的赋值写法本身存在逻辑问题:即便父类有具体的setter实现,也不能直接通过super对象这样赋值,需通过正确的方式调用父类的setter逻辑。


解决方案

方案1:直接操作父类私有属性

由于父类初始化时已经创建了_in1私有属性,子类的getter与setter可以直接访问该属性,无需通过super调用抽象方法:

class TNot (TLogElement):
    def __init__(self, _in1=None, _in2=None):
        super().__init__(_in1)

    @property
    def in1(self):
        return self._in1

    @in1.setter
    def in1(self, _in1):
        self._in1 = _in1

方案2:给父类property提供基础实现

若需要复用父类的属性逻辑,可修改父类,为in1的@property与setter添加基础实现,同时保留至少一个抽象方法确保父类无法实例化:

from abc import ABC, abstractmethod

class TLogElement(ABC):
    def __init__(self, _in1=None,_in2=None):
        self._in1 = _in1
        self._in2 = _in2

    @property
    def in1(self):
        return self._in1

    @in1.setter
    def in1(self, _in1):
        self._in1 = _in1

    # 保留抽象方法确保父类无法实例化
    @abstractmethod
    def placeholder_abstract_method(self):
        pass

class TNot (TLogElement):
    def __init__(self, _in1=None, _in2=None):
        super().__init__(_in1)

    @property
    def in1(self):
        return super().in1

    @in1.setter
    def in1(self, _in1):
        # 调用父类setter的正确方式
        super().in1 = _in1

    def placeholder_abstract_method(self):
        pass

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:40:32