我有这个看起来很奇怪的问题......所以也许我只是弄错了 - 在这种情况下,请告诉我。
我有一个实现__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
?提前致谢!
答案 0 :(得分:1)
我认为您的代码可以按预期工作。这只是一个警告,告诉你子类中声明的参数与基类中声明的参数不同。我已经阅读了你的评论,所以我认为没有必要解释为什么IDE会发出这样的警告。
但实际上,你想要做的是一般地包装函数_call
,所以它不是普通的基类,而是一个特殊的基类。
总之,你完全正确地做到了。