使用 super().__init__() 时,我不得不向 BaseClass 添加一个虚拟参数并且不知道为什么

I had to add a dummy parameter to BaseClass when using super().__init__() & don't know why

在下面的示例代码中,我在 BaseSensorClass 中添加了一个 'dummy' 参数以使其工作。我不明白为什么这是必要的。

我正在编写一些代码来读取几种不同类型传感器的传感器信息,因此我创建了一个具有通用参数的 BaseSensorClass 和用于传感器类型的子 类。这个例子被简化了,只有一个温度传感器。

#!/usr/bin/python3

def main():
    s1 = TemperatureSensorClass(123,'first',  99.9)
    s2 = TemperatureSensorClass(234,'second', 22.2)
    print('s1 name = ',  s1.name,  ' id = ',  s1.id, ' temperature = ', s1.temperature)
    print('s2 name = ',  s2.name,  ' id = ',  s2.id, ' temperature = ', s2.temperature)

class BaseSensorClass:
    def __init__(self, dummy, id = 0, name = 'noname'):
        self.id = id
        self.name = name

class TemperatureSensorClass(BaseSensorClass):
    def __init__(self, id = 0, name = 'x', temperature = 0):
        super().__init__(self, id, name)
        self.temperature = temperature
        print('TemperatureSensorClass called with name=',  name)

if __name__ == "__main__":
    main()

我希望它在没有 'dummy' 参数的情况下也能工作,但如果我删除它,我会收到错误 TypeError: init() takes from 1 to 3 positional arguments但给出了 4 个

您不应该手动将 self 传递给 __init__。与 python 实例方法一样,对象的引用会自动传入。或多或少地执行 super().__init__(a, b) 会执行 <super class>.__init__(self, a, b)。当你手动传递 self 时,你最终将它传递给构造函数两次,这就是你得到四个位置参数的原因。

以下代码有效但未使用 dummy:

def main():
    s1 = TemperatureSensorClass(123,'first',  99.9)
    s2 = TemperatureSensorClass(234,'second', 22.2)
    print('s1 name = ',  s1.name,  ' id = ',  s1.id, ' temperature = ', s1.temperature)
    print('s2 name = ',  s2.name,  ' id = ',  s2.id, ' temperature = ', s2.temperature)

class BaseSensorClass:
    def __init__(self, id = 0, name = 'noname'):
        self.id = id
        self.name = name

class TemperatureSensorClass(BaseSensorClass):
    def __init__(self, id = 0, name = 'x', temperature = 0):
        super().__init__(id, name)
        self.temperature = temperature
        print('TemperatureSensorClass called with name=',  name)

if __name__ == "__main__":
    main()