让我们定义一个名为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方式。
答案 0 :(得分:1)
您可以使用raise NotImplementedError
,as 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