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

如何以pythonic的方式重现Java接口行为,python,duck-typing,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 ow

让我们定义一个名为
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类型和EAFP的含义,但是如果这意味着我必须尽可能晚地推迟调试(即在调用时),那么我不同意这种想法。我不明白为什么这么多人似乎喜欢EAFP哲学,但我希望成为他们的一部分


有人能转化我,并解释如何以安全预测的方式实现这一点,即防止程序员在扩展
过滤器
时犯错误,以类似于Python的方式

您可以使用
引发未实现的错误
,:


不能在编译时强制执行此操作。但是,您可以在基类的
job()
中引发NotImplementedError,以指示该方法在应该被重写时未被重写。
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