@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 更灵活?