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_1
和 self._common_2
.
所以我的想法是CaseBase
class的__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)
来调用其直接父级的构造函数。
我要建模几个案例,每个案例都由一个class
实现。我想确保每个 class
必须有 2 个方法 get_input()
和 run()
。所以在我看来,我可以写一个 CaseBase
class ,其中这 2 个方法被修饰为 @abstractmethod
。因此,任何 child class 都必须实现这两个方法。而这正是我的目标。
但是,由于我的工作性质,每个案例都是针对不同的主题,很难定义一组固定的属性。属性应该在 class
的 __init__
方法中定义。这意味着我不知道在 CaseBase
class 中究竟应该写什么属性。我所知道的是,所有 children 案例都必须具有一些共同属性,例如 self._common_1
和 self._common_2
.
所以我的想法是CaseBase
class的__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)
来调用其直接父级的构造函数。