【问题标题】:Python error when create super class : "TypeError: object.__init__() takes no parameters"创建超类时出现 Python 错误:“TypeError: object.__init__() 不带参数”
【发布时间】: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): 时,您期望argskwargs 具有什么样的值?您认为应该如何处理这些价值观?
  • 如果你不理解这些东西——例如,因为你正在使用一种新的语言,并且修改了别人的代码——那么作为 Stack Overflow 的十年用户,你应该明白现在如何做一些research, as expected。例如,您可以尝试查找 super itself

标签: python runtime-error super


【解决方案1】:

当您调用super().__init__(*args, **kwargs) 时,您将所有 未命名参数传递给父类的__init__。在您的情况下,父类是 object,它不带任何参数。

Robot.__init__ 中,您将 alpha 作为关键字参数传递给 Motor.__init__,它会绑定到 kwargs ,因此你的错误。

要解决这个问题,您需要处理 Robot.__init__ 中的alpha

class Motor:
    def __init__(self, driver, channel, *args, alpha=None, **kwargs):
        super(Motor, self).__init__(*args, **kwargs)

        ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2015-01-15
    • 2021-08-29
    相关资源
    最近更新 更多