使用 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()
在下面的示例代码中,我在 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()