鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    缺少参数age;PersonNode.__init__() missing 1 required positional argument: 'age'

    已定时 已固定 已锁定 已移动
    VIP问答专区
    init缺少参数 缺少参数 无法打印输出
    2
    2
    141
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 1
      1635731080 年度VIP
      最后由 编辑

      标题:PersonNode.init() missing 1 required positional argument: 'age'

      提问模板:说缺少参数,但是感觉没有缺少

      Traceback (most recent call last):
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/demo_python_pkg/writer_node", line 33, in <module>
      sys.exit(load_entry_point('demo-python-pkg==0.0.0', 'console_scripts', 'writer_node')())
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 10, in main
      node = WriterNode('法外狂徒张三', 18, '论快速入狱')
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 5, in init
      super().init(name, age)
      TypeError: PersonNode.init() missing 1 required positional argument: 'age'

      背景(可选):

      [在这里描述你要实现什么,也许有更好的方案]

      问题描述:colcon build;

      ros@ros-VirtualBox:~/chapt2_3/chapt2_3_ws$ source install/setup.bash
      ros@ros-VirtualBox:~/chapt2_3/chapt2_3_ws$ ros2 run demo_python_pkg writer_node


      Traceback (most recent call last):
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/demo_python_pkg/writer_node", line 33, in <module>
      sys.exit(load_entry_point('demo-python-pkg==0.0.0', 'console_scripts', 'writer_node')())
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 10, in main
      node = WriterNode('法外狂徒张三', 18, '论快速入狱')
      File "/home/ros/chapt2_3/chapt2_3_ws/install/demo_python_pkg/lib/python3.10/site-packages/demo_python_pkg/writer_node.py", line 5, in init
      super().init(name, age)
      TypeError: PersonNode.init() missing 1 required positional argument: 'age'

      具体细节和上下文:

      person.py代码
      import rclpy
      from rclpy.node import Node

      class PersonNode(Node):
      def init(self, node_name: str, name: str, age: int) -> None:
      super().init(node_name)
      self.age = age
      self.name = name

      def eat(self, food_name: str):
          self.get_logger().info(f'我叫{self.name},今年{self.age}岁,我现在正在吃{food_name}')
      

      def main():
      rclpy.init()
      node = PersonNode('person_node', '法外狂徒张三', '18')
      node.eat('鱼香肉丝')
      rclpy.spin(node)
      rclpy.shutdown()


      writer_node.py代码
      from demo_python_pkg.person_node import PersonNode

      class WriterNode(PersonNode):
      def init(self, name: str, age: int, book: str) -> None:
      super().init(name, age)
      print('WriterNode 的 init 函数被调用了')
      self.book = book

      def main():
      node = WriterNode('法外狂徒张三', 18, '论快速入狱')
      node.eat('鱼香肉丝')


      setup.py
      entry_points={
      'console_scripts': [
      'python_node = demo_python_pkg.python_node:main',
      'person_node = demo_python_pkg.person_node:main',
      'writer_node = demo_python_pkg.writer_node:main',
      ],
      },
      目录展示
      2ac34ae9-5fa0-4be8-aab0-07052c7e7894-image.png
      f78ae182-8f7e-4157-a970-153b31c8345a-image.png

      972882a2-04b7-4715-96ee-5237cf76bc17-image.png

      尝试过的解决方法:

      问了deepseek,按照他的修改,但是显示新的错误,进行修改,继续报错

      小鱼小 1 条回复 最后回复 回复 引用 0
      • 小鱼小
        小鱼 技术大佬 @1635731080
        最后由 编辑

        @1635731080 你这个错误的本质是:

        TypeError: PersonNode.__init__() missing 1 required positional argument: 'age'
        

        虽然你明明传了 age,但出错行在 WriterNode.__init__() 的 super().__init__(name, age),这说明它找的 super() 不是你想的 PersonNode(node_name, name, age),而是找错了继承链!


        🔍 核心问题分析:

        你定义的 PersonNode 是:

        class PersonNode(Node):
            def __init__(self, node_name: str, name: str, age: int) -> None:
                super().__init__(node_name)
                self.age = age
                self.name = name
        

        然后 WriterNode 是:

        class WriterNode(PersonNode):
            def __init__(self, name: str, age: int, book: str) -> None:
                super().__init__(name, age)  # ❌ 你以为你传给 PersonNode(name, age)
                self.book = book
        

        但是你忘了:PersonNode 的构造函数需要 三个参数:node_name, name, age,你只传了两个。


        ✅ 正确写法:

        你应该这样调用 PersonNode.__init__:

        class WriterNode(PersonNode):
            def __init__(self, name: str, age: int, book: str) -> None:
                super().__init__('writer_node', name, age)  # ✅ 补上 node_name
                self.book = book
                print('WriterNode 的 __init__ 函数被调用了')
        

        这里 'writer_node' 就是 ROS 节点名,随便你取,例如可以换成 'author_node'、'zhangsan_writer' 也行。


        总结一句话:

        你的 PersonNode.__init__() 要求是:

        def __init__(node_name, name, age)
        

        但是你只传了两个参数:

        super().__init__(name, age)  # ❌ 缺了 node_name
        

        因此报错。


        ✔ 修改后完整 WriterNode:

        from demo_python_pkg.person_node import PersonNode
        
        class WriterNode(PersonNode):
            def __init__(self, name: str, age: int, book: str) -> None:
                super().__init__('writer_node', name, age)  # ✅ 正确传入三个参数
                print('WriterNode 的 __init__ 函数被调用了')
                self.book = book
        
        def main():
            import rclpy
            rclpy.init()
            node = WriterNode('法外狂徒张三', 18, '论快速入狱')
            node.eat('鱼香肉丝')
            rclpy.spin(node)
            rclpy.shutdown()
        

        如果你还有其他 Node 的继承设计问题,或者希望 WriterNode 中动态传入 node_name,也可以优化,我们可以继续改。是否需要我帮你重构让 node_name 更灵活?

        新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

        1 条回复 最后回复 回复 引用 0
        • 第一个帖子
          最后一个帖子
        皖ICP备16016415号-7
        Powered by NodeBB | 鱼香ROS