我应该在哪里将抽象类放在python包中?

问题描述

我正在像这样向我的python包中添加抽象类:

class AbstractClass(ABC):

    @abstractmethod
    def do_something(self):
        pass

将有多个从AbstractClass继承的子类,如下所示:

class SubClass(AbstractClass):

    def do_something(self):
        pass

我想知道关于我不了解的抽象类的python软件包是否有约定。

  • 应该将抽象类与子类分开,还是应该将它们都放在同一目录中?
  • 抽象函数的命名以及那里的约定如何?

我意识到这是相当主观的。我要征求意见,而不是“正确”或“错误

谢谢!

解决方法

没有约定。如果这仅是一个项目的全部内容,那么我将希望将抽象类与具体子类放在任何级别。如果所有子类都在一个文件中,那么我也将抽象类放在该文件中。如果所有子类都在目录中的单个文件中,则将抽象类放在它们自己的文件中。我将抽象类放在其他地方的原因是,如果我要分离出可与其他项目一起重用的实用程序代码。简而言之,抽象类只是一段代码。只是另一堂课。像对待其他任何东西一样对待。

就命名而言,给定类是/做的类别的自然命名通常就足够了。如果您的抽象类是Animal,而您的子类是Goat,Horse等,我将没有理由调用您的抽象类AbstractAnimal,因为很明显已经发生了什么事情……您不会直接实例化Animal 。另外,如果您正在考虑重用它的类,并且看到其中有一个抽象方法,那么您就知道它是抽象的。

,

根据您的风格指南,可能会有。 我唯一的看法是,任何抽象函数(如果未实现)都应该引发错误,并且应属于抽象方法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