为了账号安全,请及时绑定邮箱和手机立即绑定

将通用方法放在 Python 中的抽象类中是一个好习惯吗?

将通用方法放在 Python 中的抽象类中是一个好习惯吗?

慕妹3146593 2021-08-11 20:08:20
我正在使用该abc模块来定义子类必须支持的接口。还有一些通用方法存在于所有子类中。可以将它们放在抽象类中还是应该只包含抽象方法(即用 装饰@abc.abstractmethod)?
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

是的,抽象类可以有非抽象方法。


通常我们所说的抽象类只是一个不能被实例化的类。


另一方面,我们所说的接口是一个只有方法声明而没有实现的类。特别是它是一个抽象类,因为它没有构造函数。


当然,在 Python 中没有真正的接口:每个方法都必须有一个主体。但是我们可以通过raise NotImplementedError().


无论如何,接口形成抽象类的子集。这显然表明存在不是接口的抽象类。这正是您所描述的情况。是的,抽象类可能包含已实现的非抽象方法。这不是一个坏习惯。当给定方法不依赖于具体实现时,这尤其有用。


例如,考虑一个通用解析器的接口(我正在考虑json.load和json.loads):


class ILoader(ABC):

    @abstractmethod

    def load(self, stream):

        raise NotImplementedError()

loads使用默认实现给出接受字符串而不是流的方法是完全可以的:


class AbstractLoader(ABC):

    @abstractmethod

    def load(self, stream):

        raise NotImplementedError()


    def loads(self, text):

        stream = io.StringIO(text)

        return self.load(stream)

虽然我会使用Abstract前缀而不是I. ;)


查看完整回答
反对 回复 2021-08-11
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号