在 Python 中的 @abstractmethod 函数前添加 @属性 的用法

the usage of adding @property before an @abstractmethod function in Python

在抽象基class的设计中,我可以发现如下场景。为抽象基class中的方法添加@属性的设计考虑是什么?当我实现相关功能时,例如,这里的 f1 与实现 f1 相比有什么区别吗,后者没有 @property 装饰器?

@abstractmethod
def f(self)
     pass

@property
@abstractmethod
def f1(self)
    pass

这将是一个摘要 属性。 From docs:

A subclass of the built-in property(), indicating an abstract property.

This special case is deprecated, as the property() decorator is now correctly identified as abstract when applied to an abstract method:

class C(ABC):
    @property
    @abstractmethod
    def my_abstract_property(self):
        ...

这将允许你做这样的事情:

class CD(C):
    def my_abstract_property(self):
        return 1

cd = CD()
print(cd.my_abstract_property)
# Outputs 1

但是,如果你一开始只有一个 @abstractmethod 装饰器,比如

class C(ABC):
    @abstractmethod
    def my_abstract_property(self):
        ...

你必须做

class CD(C):
    def my_abstract_property(self):
        return 1

cd = CD()
#                            vv
print(cd.my_abstract_property())
# Outputs 1