[英]Python NotImplementedError for instance attributes
如何將實例屬性標記為未在基類中實現? (與這個討論將類屬性標記為未實現的問題不同,但是也許我沒有正確理解基類...)
例如我想要類似的東西
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
所有子類在初始化時設置self.x
屬性?
編輯: 鏈接到相關問題
一種使用類裝飾器和描述符的解決方案( __get__
方法):
def abstract_variables(*args):
class av:
def __init__(self, error_message):
self.error_message = error_message
def __get__(self, *args, **kwargs):
raise NotImplementedError(self.error_message)
def f(klass):
for arg in args:
setattr(klass, arg, av('Descendants must set variable `{}`'.format(arg)))
return klass
return f
@abstract_variables('x', 'y')
class Base:
def __init__(self):
pass
class Derived(Base):
x = 10
b = Base()
d = Derived()
print(d.x) # prints 10
print(d.y) # raises NotImplementedError
印刷品:
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`
我會考慮將x
財產。
class Base():
def __init__(self):
self.__x = None
self.__x_is_set = False
@property
def x(self):
if not self.__x_is_set:
raise NotImplementedError('Descendents from Base must set x')
else:
return self.__x
@x.setter
def x(self, value):
self.__x = value
self.__x_is_set = True
class GoodSub(Base):
def __init__(self):
super().__init__()
self.x = 5
class BadSub(Base):
def __init__(self):
super().__init__()
pass
class AlsoBad(Base):
def __init__(self):
super().__init__()
self.__x = 5 # sets the attribute, but not through the property
>>> g, a, b = GoodSub(), BadSub(), AlsoBad()
>>> g.x
5
>>> a.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in x
NotImplementedError: Descendents from Base must set x
>>> b.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in x
NotImplementedError: Descendents from Base must set x
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.