【问题标题】:Where should I put abstract classes in a python package?我应该将抽象类放在 python 包中的什么位置?
【发布时间】:2020-09-16 18:04:36
【问题描述】:

我正在向我的 python 包中添加抽象类,如下所示:

class AbstractClass(ABC):

    @abstractmethod
    def do_something(self):
        pass

会有多个子类继承自AbstractClass,如下所示:

class SubClass(AbstractClass):

    def do_something(self):
        pass

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

  • 抽象类应该与子类分开,还是应该都在同一个目录中?
  • 抽象函数的命名如何,有什么约定吗?

我意识到这是相当主观的。我是在征求意见,而不是什么是“对”或“错”

谢谢!

【问题讨论】:

  • 没有约定——发明一个。 ;¬)

标签: python abstract-class conventions


【解决方案1】:

没有想到任何约定。如果这只是一个项目,我希望将抽象类与具体子类放在它们所处的任何级别。如果所有子类都在一个文件中,那么我也会将抽象类放在该文件中。如果所有子类都在一个目录中的单个文件中,我会将抽象类放在它们旁边的自己的文件中。我将抽象类放在其他地方的原因是如果我要分离出可以与其他项目重用的实用程序代码。简而言之,抽象类只是一段代码。只是另一个班级。像对待任何其他人一样对待它。

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

【讨论】:

  • 我不能投票,因为 stackoverflow 说我太穷了。但是感谢您的回复!
【解决方案2】:

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

例如,如果您使用的是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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 2011-01-18
    • 1970-01-01
    • 2011-12-26
    • 2021-04-25
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多