【问题标题】:Python Cmd module, subclassing issuePython Cmd 模块,子类化问题
【发布时间】:2010-10-20 16:28:11
【问题描述】:

我正在尝试找出这段代码中的哪些问题:

#!/usr/bin/python

import cmd

class My_class (cmd.Cmd):
    """docstring for Twitter_handler"""
    def __init__(self):
        super(My_class, self).__init__()

if __name__ == '__main__':
    my_handler = My_class()

这是我得到的错误

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    my_handler = My_class()
  File "main.py", line 9, in __init__
    super(My_class, self).__init__()
TypeError: super() argument 1 must be type, not classobj

如果我将“My_c​​lass”的超类更改为一个对象,它就可以正常工作。我哪里错了?

【问题讨论】:

    标签: python


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      cmd.Cmd 不是 Python 2.5、2.6、2.7 中的新样式类。

      请注意,您的代码不会在 Python 3.0 中引发异常。

      【讨论】:

      • 是不是因为 cmd 模块是用 Python 3 重写的?
      • 不。这是因为在 Python 3.0 中,所有类都是“新样式类”。
      • (事实上,2.5 和 3.0 的 cmd.py 之间的差异会告诉您这些版本之间的更改很少。)
      • 我想知道,你能否将 cmd.py 中的 'class Cmd:' 更改为 'class Cmd(object)' 并期望没有问题?
      • 它可能会起作用。但是您将拥有地球上唯一的带有新型 Cmd 类的 python 2.x 安装...不要让您发布的任何代码依赖于它:)
      【解决方案3】:

      所以如果super() 不起作用,请使用:

      import cmd
      
      class My_class(cmd.Cmd):
          def __init__(self):
              cmd.Cmd.__init__(self)
      

      【讨论】:

        【解决方案4】:

        如果您的MyClass 扩展了object,您仍然可以使用super()。即使cmd.Cmd 模块不是 一个新样式的类,这仍然有效。像这样:

        #!/usr/bin/python
        
        import cmd
        
        class My_class (cmd.Cmd, object):
            """docstring for Twitter_handler"""
            def __init__(self):
                super(My_class, self).__init__()
        
        if __name__ == '__main__':
            my_handler = My_class()
        

        【讨论】:

        • 这也适用于我。任何人都可以权衡 Py2 或 Py3 中的任何奇怪的副作用吗?
        猜你喜欢
        • 1970-01-01
        • 2017-01-10
        • 2018-12-11
        • 2021-05-09
        • 1970-01-01
        • 2012-11-14
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多