pla*_*etp 9 python inheritance abstract-class
我正在使用该abc模块来定义子类必须支持的接口.所有子类中都存在一些常用方法.可以将它们放在抽象类中,还是只包含抽象方法(即装饰@abc.abstractmethod)?
TL; 博士;是的,抽象类可以有非抽象方法。
通常我们所说的抽象类只是一个不能被实例化的类。
另一方面,我们所说的接口是一个只有方法声明而没有实现的类。特别是它是一个抽象类,因为它没有构造函数。
当然,在 Python 中没有真正的接口:每个方法都必须有一个主体。但是我们可以通过raise NotImplementedError().
无论如何,接口形成抽象类的子集。这显然表明存在不是接口的抽象类。这正是您所描述的情况。是的,抽象类可能包含已实现的非抽象方法。这不是一个坏习惯。当给定方法不依赖于具体实现时,这尤其有用。
例如,考虑一个通用解析器的接口(我正在考虑json.load和json.loads):
class ILoader(ABC):
@abstractmethod
def load(self, stream):
raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)
loads使用默认实现给出接受字符串而不是流的方法是完全可以的:
class AbstractLoader(ABC):
@abstractmethod
def load(self, stream):
raise NotImplementedError()
def loads(self, text):
stream = io.StringIO(text)
return self.load(stream)
Run Code Online (Sandbox Code Playgroud)
虽然我会使用Abstract前缀而不是I. ;)