使用不同的参数

时间:2017-05-16 13:56:27

标签: python oop inheritance

我有这个看起来很奇怪的问题......所以也许我只是弄错了 - 在这种情况下,请告诉我。

我有一个实现__call__方法的基类。此方法执行一些预处理,然后调用抽象_call()方法并执行一些后处理,如下所示:

class BaseCallable(object):

    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def _call(self, *args, **kwargs):
        pass

    def __call__(self, *args, *kwargs):
        # do some pre-processing
        result = self._call(*args, **kwargs)
        # do some post-processing
        return result

我希望能够为基本可调用对象创建子类,添加call()方法,使用适当的文档字符串,接受不同的参数,然后跳转到__call__。我遇到了一些问题,因为我还应该更改_call()具体实现的签名,例如:

class Sum(BaseCallable):

    def _call(self, x, y):
        return x + y

    def call(self, x, y):
        """Docstring."""
        return super(Sum, self).__call__(x, y)

我确实喜欢这个,因为pylint抱怨:

[pylint] W0221:Parameters differ from overridden '_call' method

我假设有一些 fishy 正在进行中。有关更好设计的建议吗?也许我应该限制_call()__call__()方法只接受**kwargs?提前致谢!

1 个答案:

答案 0 :(得分:1)

我认为您的代码可以按预期工作。这只是一个警告,告诉你子类中声明的参数与基类中声明的参数不同。我已经阅读了你的评论,所以我认为没有必要解释为什么IDE会发出这样的警告。

但实际上,你想要做的是一般地包装函数_call,所以它不是普通的基类,而是一个特殊的基类。

总之,你完全正确地做到了。