小编use*_*190的帖子

Python抽象属性()“无法用抽象方法实例化抽象类[]”,但我做到了

我正在尝试在 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)

python oop class abstract python-3.x

5
推荐指数
1
解决办法
6269
查看次数

标签 统计

abstract ×1

class ×1

oop ×1

python ×1

python-3.x ×1