Python 制作抽象的专业方法 class 允许每个 child class 定义自己的属性,Python3

Python pro way to make an abstract class allowing each child class to define its own attributes, Python3

我要建模几个案例,每个案例都由一个class实现。我想确保每个 class 必须有 2 个方法 get_input()run()。所以在我看来,我可以写一个 CaseBase class ,其中这 2 个方法被修饰为 @abstractmethod。因此,任何 child class 都必须实现这两个方法。而这正是我的目标。

但是,由于我的工作性质,每个案例都是针对不同的主题,很难定义一组固定的属性。属性应该在 class__init__ 方法中定义。这意味着我不知道在 CaseBase class 中究竟应该写什么属性。我所知道的是,所有 children 案例都必须具有一些共同属性,例如 self._common_1self._common_2.

所以我的想法是CaseBaseclass的__init__方法也被@abstractmethod修饰了。请参阅下面的代码。

from abc import ABC, abstractmethod
from typing import Dict, List


class CaseBase(ABC):

    @abstractmethod
    def __init__(self):
        self._common_1: Dict[str, float] = {}
        self._common_2: List[float] = []
        ...

    @abstractmethod
    def get_input(self, input_data: dict):
        ...

    @abstractmethod
    def run(self):
        ...


class CaseA(CaseBase):
    def __init__(self):
        self._common_1: Dict[str, float] = {}
        self._common_2: List[float] = []
        self._a1: int = 0
        self._a2: str = ''

    def get_input(self, input_data: dict):
        self._common_1 = input_data['common_1']
        self._common_2 = input_data['common_2']
        self._a1 = input_data['a1']
        self._a2 = input_data['a2']

    def run(self):
        print(self._common_1)
        print(self._common_2)
        print(self._a1)
        print(self._a2)


def main():
    case_a = CaseA()
    case_a.get_input(input_data={'common_1': {'c1': 1.1}, 'common_2': [1.1, 2.2], 'a1': 2, 'a2': 'good'})
    case_a.run()


if __name__ == '__main__':
    main()

我的问题:我的方式是好的Python风格吗?

我学习了很多 Python 关于如何制作摘要 class 和 child class 的教程。它们都给出了在基 class 的 __init__ 方法中定义一组固定属性的示例。我还看到一些方法可以使用 child class 中的 super().__init__ 代码来更改基础 class 中定义的属性或添加新属性。但我不确定它是否比我的方式更好(更专业)。

谢谢。

您主要正确使用了 python 3.10 中的 abc 模块。但是用@abstractmethod装饰构造函数是没有意义的。这是不必要的。每个 class,无论是否派生,都可以而且将会有自己的构造函数。如果您不想复制其代码但想在子 class 构造函数中进行进一步初始化,则可以在子 class 中调用 super().__init__(args) 来调用其直接父级的构造函数。