我正在创建一个具有基本类型的类层次结构,该基本类型将具有2个(将来可能还会有更多)子类实现。
我的第一个想法是创建一个抽象基类(从abc.ABC
继承),必要时使用@abstractmethod
(对于在我的具体子类中会有所不同的方法)进行创建,同时还要使用常见的方法实现(用于所有具体子类使用的方法。
这是我的意思的示例:
from abc import ABC, abstractmethod
class BaseClass(ABC):
def __init__(self, var1, var2):
self.var1 = var1
self.var2 = var2
def common_method(self):
"""This method is used as-is by all subclasses."""
return self.var1 + 1
@abstractmethod
def specific_method(self):
"""This method needs specific implementations."""
编写基类是否是一种良好的实践(不是“最佳实践”;我在寻找这是否是对这些构造的适当使用)?在我的BaseClass
中使用实例方法合适吗?
答案 0 :(得分:1)
我会说:是的。
有一个称为 Template Method 的设计模式,可以捕获您在问题中描述的内容,请参见https://sourcemaking.com/design_patterns/template_method。
答案 1 :(得分:0)
抽象基类用于确保任何派生类提供某些指定的行为(https://localhost:8080-> rationale
)。例如,您要创建自定义数据管理器,该管理器必须能够保存/加载数据并且必须支持对基本数据的迭代:
import abc
class SavableLoadable(abc.ABC):
@abc.abstractmethod
def save(self):
raise NotImplementedError
@abc.abstractmethod
def load(self):
raise NotImplementedError
class Iteratable(abc.ABC):
@abc.abstractmethod
def __iter__(self):
raise NotImplementedError
class MyDataManager(Iteratable, SavableLoadable):
def __init__(self):
pass
def __iter__(self):
pass
def save(self):
pass
def load(self):
pass
这不是类层次结构。这是通过继承定义
因此,您不需要ABC来创建类层次结构。 ABC具有另一个目的(尽管很接近)。