我正在寻找一种方法来解决在基类中指定需要在所有子类中定义的类属性的问题。
我有一个
BaseClass
,其字符串属性为 action
。对于所有继承 BaseClass
的子类,我希望它们都必须定义 action
的属性。我知道我可以使用 @property
和 @abstractmethod
来做到这一点,但是有没有办法直接将其作为属性来做到这一点?我想象的伪代码:
class BaseClass:
action: str
class ChildClass(BaseClass):
def dummy_method(self):
pass
# Should raise an error for not setting `action`
# and if possible show an error with StaticAnalysis:
ChildClass()
您可以通过使用 抽象基类 (
ABC
) 和 @property
装饰器来做到这一点:
from abc import ABC, abstractmethod
class BaseClass(ABC):
@classmethod
@property
@abstractmethod
def action(cls) -> str:
raise NotImplementedError
class GoodChildClass(BaseClass):
action = "foobar"
class BadChildClass(BaseClass):
pass
if __name__ == '__main__':
# Will work just fine
good_child = GoodChildClass()
# Will raise NotImplementedError
bad_child = BadChildClass()