实例属性的Python NotImplementedError
如何将实例属性标记为未在基类中实现?和讨论将类属性标记为未实现的问题不同,但也许我并没有正确理解基类 e、 我想要像这样的东西实例属性的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
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但我应该包装什么?我把克拉斯原封不动地还给了他