如何以pythonic方式重现Java接口行为

时间:2014-03-26 23:51:54

标签: python duck-typing

让我们定义一个名为Filter的类。我想通过子类扩展这个类,我希望所有这些子类都覆盖一个方法:job

更具体地说

class Filter(object):
    def __init__(self, csvin=None):
        self._input = csvin

    # I want this to be abstract. All the classes that inherit from Filter should
    # implement their own version of job.
    def job(self):
        pass

换句话说,我想确保Filter的任何子类都有一个名为job的方法。

我听说过模块abc,但我也读到了这些名为duck-typing和EAFP的概念。我的理解是,如果我是一只鸭子,我会尝试运行

f = SomeFilter()
f.job()

看看它是否有效。这是我的问题,如果它引发任何异常,我在编写课程SomeFilter时应该更加小心。

我很确定我并不完全理解duck-typing和EAFP的含义,但是如果它意味着我必须尽可能晚地推迟调试(也就是在调用时),那么我不同意这种方式思考。我不明白为什么这么多人似乎很欣赏这种EAFP理念,但我希望成为他们的一部分。

有人可以转换我并解释如何以安全预测方式实现这一目标,即阻止程序员在扩展{{1}时出错},以pythonic方式

1 个答案:

答案 0 :(得分:1)

您可以使用raise NotImplementedErroras per the documentation

class Filter(object):
    def __init__(self, csvin=None):
        self._input = csvin

    # I want this to be abstract. All the classes that inherit from Filter should
    # implement their own version of job.
    def job(self):
        raise NotImplementedError