问题描述
我正在像这样向我的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