ABC中的实现

时间:2018-10-01 22:16:41

标签: python python-3.x oop

我正在创建一个具有基本类型的类层次结构,该基本类型将具有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中使用实例方法合适吗?

2 个答案:

答案 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来创建类层次结构。 ABC具有另一个目的(尽管很接近)。