如何在超类中定义一个方法,使它与任何子类兼容?

时间:2014-11-20 17:07:36

标签: python class inheritance

我有几节课:

class Sup:
    def meth (self, ?????):
        pass

class Sub1(Sup):
    def meth (self, foo = 1):
        ...

class Sub2(Sup):
    def meth (self, bar = 2, baz = 3):
        ...

如何用{?1}替换?????中的Sup.meth

基本上,我想要一些类似于Lisp中被忽略的&rest lambda-list关键字来安抚arguments-differ/Arguments number differs from overridden method警告。

我尝试了什么:

  1. **kwargs添加到Sup.meth - 没有改变任何内容
  2. 使用Sub*.meth注释# pylint: disable=arguments-differ - 有效,但很难看。
  3. PS。 Sup是一个收集统计数据的抽象类; Sub*是不同的方法; meth使用不同的铃声和口哨打印对象。

2 个答案:

答案 0 :(得分:3)

我发现pylint对许多Python功能有不寻常的看法。它认为some_function(*list_of_args)是“坏魔法”,例如(W0124)。

当你和pylint 从不同意“问题”时,解决方案不是代码中的奇怪评论,而是永远在~/.pylintrc中消除该消息。 (pylint --generate-rcfile将吐出一个您可以自己编辑的示例配置文件。)在那里,您可以设置:

  • 故意未使用的变量的正则表达式:dummy-variables-rgx=_$|__$

  • 变量,类和常量名称的正则表达式:function-rgx=[a-z_][a-z0-9_]{0,30}$

  • 使个别警告或整个讯息类别(“IRCWEF”之一)保持沉默:disable=I0011,W0142,R

~/.pylintrc唯一的方式我发现你可以禁用某些东西 - 比如“I0011: "Locally disabling %s",因为本地静音I0011本身会生成另一条I0011消息(其中是彻头彻尾的虐待狂。)

对于项目,我通常会创建一个单行shell脚本来进一步禁用我不想修复的内容:

#!/bin/bash

pylint --output=colorized --disable=C0103 *.py | less -R -
#  :C0103 (invalid-name): *Invalid name "%s" for type %s (should match %s)*

翻译:“我已经知道前一个人有自己的命名惯例,所以请不要再告诉我8000次。”

答案 1 :(得分:0)

您应该查看*args的位置参数和**kwargs的关键字参数。

此处提供了更多信息:*args and **kwargs?