【发布时间】:2021-12-08 20:29:41
【问题描述】:
我正在从 https://github.com/NVIDIA-AI-IOT/jetbot/blob/master/jetbot/robot.py 修改脚本,删除 trailets 库,因为我不需要它。我现在收到错误消息:
Traceback (most recent call last):
File "ak_test.py", line 4, in <module>
robot = Robot()
File "/home/jetbot/jetbot/jetbot/robot.py", line 20, in __init__
self.left_motor = Motor(self.motor_driver, channel=self.left_motor_channel, alpha=self.left_motor_alpha)
File "/home/jetbot/jetbot/jetbot/motor.py", line 14, in __init__
super(Motor, self).__init__(*args, **kwargs) # initializes traitlets
TypeError: object.__init__() takes no parameters
我已经复制了下面将复制问题的代码的相关位:
import time
from Adafruit_MotorHAT import Adafruit_MotorHAT
class Motor():
value = float()
# config
alpha = float(1.0)
beta = float(0.0)
def __init__(self, driver, channel, *args, **kwargs):
super(Motor, self).__init__(*args, **kwargs) # initializes traitlets
self._driver = driver
self._motor = self._driver.getMotor(channel)
if(channel == 1):
self._ina = 1
self._inb = 0
else:
self._ina = 2
self._inb = 3
atexit.register(self._release)
def _observe_value(self, change):
self._write_value(change['new'])
def _write_value(self, value):
"""Sets motor value between [-1, 1]"""
mapped_value = int(255.0 * (self.alpha * value + self.beta))
speed = min(max(abs(mapped_value), 0), 255)
self._motor.setSpeed(speed)
if mapped_value < 0:
self._motor.run(Adafruit_MotorHAT.FORWARD)
# The two lines below are required for the Waveshare JetBot Board only
self._driver._pwm.setPWM(self._ina,0,0)
self._driver._pwm.setPWM(self._inb,0,speed*16)
else:
self._motor.run(Adafruit_MotorHAT.BACKWARD)
# The two lines below are required for the Waveshare JetBot Board only
self._driver._pwm.setPWM(self._ina,0,speed*16)
self._driver._pwm.setPWM(self._inb,0,0)
def _release(self):
"""Stops motor by releasing control"""
self._motor.run(Adafruit_MotorHAT.RELEASE)
# The two lines below are required for the Waveshare JetBot Board only
self._driver._pwm.setPWM(self._ina,0,0)
self._driver._pwm.setPWM(self._inb,0,0)
class Robot():
left_motor = Motor
right_motor = Motor
i2c_bus = 1
left_motor_channel = 1
left_motor_alpha = 1.0
right_motor_channel = 2
right_motor_alpha = 1.0
def __init__(self, *args, **kwargs):
super(Robot, self).__init__(*args, **kwargs)
self.motor_driver = Adafruit_MotorHAT(i2c_bus=self.i2c_bus)
self.left_motor = Motor(self.motor_driver, channel=self.left_motor_channel, alpha=self.left_motor_alpha)
self.right_motor = Motor(self.motor_driver, channel=self.right_motor_channel, alpha=self.right_motor_alpha)
def set_motors(self, left_speed, right_speed):
self.left_motor.value = left_speed
self.right_motor.value = right_speed
def forward(self, speed=1.0, duration=None):
self.left_motor.value = speed
self.right_motor.value = speed
def backward(self, speed=1.0):
self.left_motor.value = -speed
self.right_motor.value = -speed
def left(self, speed=1.0):
self.left_motor.value = -speed
self.right_motor.value = speed
def right(self, speed=1.0):
self.left_motor.value = speed
self.right_motor.value = -speed
def stop(self):
self.left_motor.value = 0
self.right_motor.value = 0
robot = Robot()
【问题讨论】:
-
Motor扩展了object,它的构造函数不接受任何参数。你想做什么?你认为你将初始化哪些 traitlets,以及如何初始化? -
当你是
object的子类时,你不需要调用__init__方法。或者,如果您这样做,请在不带参数的情况下调用它。 -
去掉
super().__init__()部分。你的Motor类没有扩展任何有意义的东西,所以__init__没有任何意义。 -
用你自己的话来说,当你写
super(Motor, self).__init__(*args, **kwargs)时,你认为这意味着什么?用您自己的话来说,您认为Motor的基类是什么?用您自己的话来说,您认为应该如何初始化该类的实例?用您自己的话来说,当您为Motor类编写def __init__(self, driver, channel, *args, **kwargs):时,您期望args和kwargs具有什么样的值?您认为应该如何处理这些价值观? -
如果你不理解这些东西——例如,因为你正在使用一种新的语言,并且修改了别人的代码——那么作为 Stack Overflow 的十年用户,你应该明白现在如何做一些research, as expected。例如,您可以尝试查找
superitself。
标签: python runtime-error super