我正在尝试在 python 3.7 中创建一个具有许多抽象 python 属性的基类。
我使用 @property、@abstractmethod、@property.setter 注释尝试了一种方法(请参阅下面的“开始”)。这有效,但如果子类没有实现 setter,它不会引发异常。这就是我使用 @abstract 的意义所在,所以这没有什么好处。
所以我尝试用另一种方式(参见下面的“结束”)使用两个 @abstractmethod 方法和一个“property()”,它本身不是抽象的,而是使用这些方法。这种方法在实例化子类时会产生错误:
# {TypeError}Can't instantiate abstract class FirstStep with abstract methods end
Run Code Online (Sandbox Code Playgroud)
我清楚地实现了抽象方法,所以我不明白它的含义。“end”属性未标记为@abstract,但如果我将其注释掉,它就会运行(但我没有得到我的属性)。我还添加了测试非抽象方法“test_elapsed_time”来证明我拥有正确的类结构和抽象(它有效)。
我是否有可能做了一些愚蠢的事情,或者 property() 周围是否有一些特殊行为导致了这种情况?
class ParentTask(Task):
def get_first_step(self):
# {TypeError}Can't instantiate abstract class FirstStep with abstract methods end
return FirstStep(self)
class Step(ABC):
# __metaclass__ = ABCMeta
def __init__(self, task):
self.task = task
# First approach. Works, but no warnings if don't implement setter in subclass
@property
@abstractmethod
def start(self):
pass
@start.setter
@abstractmethod
def start(self, value): …Run Code Online (Sandbox Code Playgroud)