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

