Python super().__ init __()TypeError:super()至少接受1个参数(给定0)

时间:2018-09-05 22:34:27

标签: python python-2.7

我给出了一些未公开的代码,这些代码可以在运行Python 3的Windows上很好地运行,但是在测试Im将该Python移开后,请运行Ubuntu 2.7.12。

我无法更改服务器上的Python版本,因为其他人正在使用它并可能会破坏其代码。

出现错误的Python类是:

import logging

    # device is a test class to handle replay functions
    class Device:
        intermittent = False
        loop = False


        def __init__(self, name, mac, description, srcFile, real):
            super().__init__()
            self.name = name
            self.MAC = mac
            self.description = description
            self.srcFile = srcFile
            self.running = False
            self.real = real

        def to_dictionary(self):
            data = {'name': self.name,
                    'mac': self.MAC,
                    'description': self.description,
                    'active': self.running,
                    'real': self.real}
            return data

        def start(self):
            logging.debug("starting " + self.name)
            self.running = True

        def resume(self):
            logging.debug("resuming " + self.name)
            self.running = True

        def stop(self):
            logging.debug("stopping " + self.name)
            self.running = False

我了解Python 3的面向对象语法与2.7不同,如何更改此类以与P​​ython 2.7一起使用?

谢谢

1 个答案:

答案 0 :(得分:1)

super的零参数调用是Python 3的新功能。如果要编写交叉兼容的代码,则不能使用它。有关详细信息,请参见PEP 3135 -- New Super

  

如何更改此类以与P​​ython 2.7一起使用?

首先,应将行class Device:更改为继承object,以使您拥有new-style class

(可选)将from future import unicode_literals添加到模块的开头。由于您在日志记录调用中使用字符串添加,因此如果您处理Device属性中的文本数据,则可能需要使用字符串添加。但是,解决该问题的更好方法可能是在日志调用中使用%格式的字符串,例如:

logging.debug("starting %s", self.name)

最后一行

super().__init__()

可以更改为

super(Device, self).__init__()

在所有其他条件都相同的情况下,您的代码现在看起来是交叉兼容的。

尽管,我想知道为什么您在这里完全使用super,但似乎并不需要。