实例属性的Python NotImplementedError

实例属性的Python NotImplementedError,python,inheritance,abstract-class,subclass,abstract,Python,Inheritance,Abstract Class,Subclass,Abstract,如何将实例属性标记为未在基类中实现?和讨论将类属性标记为未实现的问题不同,但也许我并没有正确理解基类 e、 我想要像这样的东西 class Base(): def __init__(self): self.x = NotImplemented class GoodSub(Base): def __init__(self, x): super().__init__() self.x = x #good class BadSub(B

如何将实例属性标记为未在基类中实现?和讨论将类属性标记为未实现的问题不同,但也许我并没有正确理解基类

e、 我想要像这样的东西

class Base():
    def __init__(self):
        self.x = NotImplemented

class GoodSub(Base):
    def __init__(self, x):
        super().__init__()
        self.x = x #good

class BadSub(Base):
    def __init__(self):
       super().__init__()
       #forgot to set self.x

good = GoodSub(5)
bad = BadSub(-1)    
good.x #returns 5
bad.x #throws error because x not implemented
或者,有没有更好的方法来强制Base的所有子类在init上设置self.x属性

<>编辑:

我会考虑把x变成一个属性。

类库: 定义初始自我: self.\uux=无 self.\uuux\uIs\u set=False @财产 def xself: 如果不是self.\uuux\u已设置: raise NOTEImplementedError“基的后代必须设置x” 其他: 返回自我 @x、 塞特 def xself,值: self.\uuux=值 self.\uuux\uIs\u set=True 路基等级: 定义初始自我: 超级__ self.x=5 底基层类别: 定义初始自我: 超级__ 通过 类数据库: 定义初始自我: 超级__ self.\uux=5设置属性,但不通过属性 >>>g,a,b=GoodSub,BadSub,AlsoBad >>>g.x 5. >>>a.x 回溯最近一次呼叫上次: 文件,第1行,在 文件,第8行,在x中 NotImplementedError:基的子代必须设置x >>>b.x 回溯最近一次呼叫上次: 文件,第1行,在 文件,第8行,在x中 NotImplementedError:基的子代必须设置x 我会考虑把X变成一个属性。< /P> 类库: 定义初始自我: self.\uux=无 self.\uuux\uIs\u set=False @财产 def xself: 如果不是self.\uuux\u已设置: raise NOTEImplementedError“基的后代必须设置x” 其他: 返回自我 @x、 塞特 def xself,值: self.\uuux=值 self.\uuux\uIs\u set=True 路基等级: 定义初始自我: 超级__ self.x=5 底基层类别: 定义初始自我: 超级__ 通过 类数据库: 定义初始自我: 超级__ self.\uux=5设置属性,但不通过属性 >>>g,a,b=GoodSub,BadSub,AlsoBad >>>g.x 5. >>>a.x 回溯最近一次呼叫上次: 文件,第1行,在 文件,第8行,在x中 NotImplementedError:基的子代必须设置x >>>b.x 回溯最近一次呼叫上次: 文件,第1行,在 文件,第8行,在x中 NotImplementedError:基的子代必须设置x
一个带有类装饰器和描述符的解决方案_get__方法:

印刷品:

10
Traceback (most recent call last):
  File "main.py", line 28, in <module>
    print(d.y)
  File "main.py", line 7, in __get__
    raise NotImplementedError(self.error_message)
NotImplementedError: Descendants must set variable `y`

一个带有类装饰器和描述符的解决方案_get__方法:

印刷品:

10
Traceback (most recent call last):
  File "main.py", line 28, in <module>
    print(d.y)
  File "main.py", line 7, in __get__
    raise NotImplementedError(self.error_message)
NotImplementedError: Descendants must set variable `y`

请注意,bad.x不会抛出错误,它会返回NotImplemented类。是的,这正是我想要解决的问题。使用@propertys感觉有点笨手笨脚,特别是如果我想在基类中定义许多抽象实例属性……请注意,bad.x不会抛出错误,它会返回NotImplemented类。是的,这正是我想要解决的问题。使用@propertys感觉有点笨手笨脚,特别是如果我想在基类中定义许多抽象实例属性……你能不能用hasattrself、“\uuuuux”而不是“uuuuux\u is\u set”来简化代码?@norok2不,因为对于所有这些子类实例,断言hasattrself、“\uuuux”。super.\uuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。super.\uuuInit\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。确保使用functools.wrapps进行更好的自省。@AdamSmith但我应该包装什么?我对克拉斯的评价是这样的,比我所支持的@property方法要好。确保使用functools.wrapps进行更好的自省。@AdamSmith但我应该包装什么?我把克拉斯原封不动地还给了他