我应该将摘要 类 放在 python 包中的什么位置?

Where should I put abstract classes in a python package?

我正在将摘要 类 添加到我的 python 包中,如下所示:

class AbstractClass(ABC):

    @abstractmethod
    def do_something(self):
        pass

会有多个子类继承自AbstractClass,像这样:

class SubClass(AbstractClass):

    def do_something(self):
        pass

我想知道 python 包是否有任何我不知道的关于抽象 类 的约定。

我意识到这是相当主观的。我是征求意见,不是'right'或'wrong'

是什么

谢谢!

没有约定俗成的想法。如果这只是一个项目,我希望将抽象的 class 与具体的子 class 放在任何级别。如果所有子 class 都在一个文件中,那么我也会将摘要 class 放在该文件中。如果所有子 class 都在目录中的单独文件中,我会将摘要 class 放在它们自己的文件中紧挨着它们的位置。我将摘要 class 放在其他地方的原因是,如果我要分离可与其他项目重用的实用程序代码。简而言之,抽象class只是一段代码。又一个 class。像对待其他人一样对待它。

就命名而言,class 给定 is/does 的自然命名通常就足够了。如果你的抽象 class 是动物,而你的子class 是山羊、马等,我认为没有理由将你的抽象 class 称为抽象动物,因为它已经很清楚了这是怎么回事......你不会直接实例化 Animal 。此外,如果您正在查看 class 考虑重用它,并且在其中看到一个抽象方法,那么您就知道它是抽象的。

根据您的风格指南,可能会有。在我看来唯一是任何抽象函数如果没有实现都应该引发错误,并且应该是抽象方法docstring的一部分。

例如,如果您使用的是 numpystyle docstrings,这样的东西是理想的:

class AbstractClass(ABC):

    @abstractmethod
    def do_something(self):
    """Does something
    
    Raises
    ------
    NotImplementedError:
         Error is raised if function is not implemented in subclass
    """
        raise NotImplementedError