【问题标题】:Using 'super' when subclassing python class that is not derived from `object`(old-style?)在子类化不是从“object”派生的python类时使用“super”(旧式?)
【发布时间】:2010-01-07 21:52:00
【问题描述】:

我正在使用来自 std 库模块 optparser 的子类 OptionParser。 (Python 2.5.2)当我尝试它时,我得到了异常:

TypeError: super() argument 1 must be type, not classobj

OptionParser,不是从object派生的。所以我添加了object 作为父类(如下所示)并且super 可以正常工作。

from optparse import OptionParser, Option
class MyOptionParser(OptionParser, object):
    """Class to change 
    """
    def __init__(self,
             usage=None,
             option_list=None,
             option_class=Option,
             version=None,
             conflict_handler="error",
             description=None,
             formatter=None,
             add_help_option=True,
             prog=None,
             epilog=None,
            ):

      super(MyOptionParser, self).__init__(usage, option_list, option_class, version, conflict_handler, description, formatter, add_help_option, prog, epilog)

if __name__ == '__main__':
    """Run a quick test
    """
    parser = MyOptionParser()
    parser.add_option("-t", "--test", type="string", dest="test")
    (options, args) = parser.parse_args()
    print "The test option is: %s" % options.test

这是正确的做法吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    是的,我不明白为什么它不起作用。您只需要在超级调用之前添加几个空格 - 正如现在所写的那样,它不是您自定义 init 方法的一部分。此外,您可能想要使用的快捷方式是 **kwargs - 如果您希望这样做,您可以在您的方法中进行 kwargs 键检查:

    class MyOptionParser(OptionParser, object):
        """Class to change 
        """
        def __init__(self, **kwargs):
            # You can limit kwargs keys here
            super(MyOptionParser, self).__init__(**kwargs)
    

    【讨论】:

      猜你喜欢
      • 2011-03-23
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多