如果我想确保子类中有某种方法,则可以在超类中实现一个接口。为此,我将使用模块abc并使我的超类继承自abc.ABC。然后,我将使用@abstractmethod装饰器来确保某些方法必须在我的子类中被覆盖。
在这一点上,我想确保其中一种方法必须是属性。我尝试使用两个装饰器来实现这一点,但发现在子类中重写此特定超类方法时没有区别。
所以我的问题是:之间有什么区别
import abc
class superclass1(abc.ABC):
@property
@abc.abstractmethod
def foo(self):
pass
class subclass1(superclass1):
def foo(self):
return "bar"
class superclass2(abc.ABC):
@abc.abstractmethod
def foo(self):
pass
class subclass2(superclass2):
def foo(self):
return "bar"
class superclass3(abc.ABC):
@property
@abc.abstractmethod
def foo(self):
pass
class subclass3(superclass3):
@property
def foo(self):
return "bar"
class superclass4(abc.ABC):
@abc.abstractmethod
def foo(self):
pass
class subclass4(superclass4):
@property
def foo(self):
return "bar"