You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Visitor设计模式报错:takes 1 positional argument but 2 were given

问题原因分析

报错CarVistor.visit() takes 1 positional argument but 2 were given的核心原因是访问者类的visit方法参数不匹配:

  • 在Car和Motorcycle的accept方法中,你调用了vistor.visit(self),这里会把当前车辆实例(比如Car对象)作为第二个参数传递给visit方法
  • 但你的CarVistor、MotorcycleVistor以及基类Vistor的visit方法只定义了self这一个参数,无法接收传递过来的车辆实例,导致参数数量不匹配报错
修复方案

需要给所有访问者类的visit方法添加对应的参数,来接收被访问的车辆对象。同时,为了符合访问者模式的设计,可以让不同的访问者类处理对应的车辆类型:

class Vehicle:
    def accept(self, visitor):
        pass

class Car(Vehicle):
    def accept(self, visitor):
        visitor.visit(self)

class Motorcycle(Vehicle):
    def accept(self, visitor):
        visitor.visit(self)

# 基类visit方法添加vehicle参数,定义统一接口
class Visitor:
    def visit(self, vehicle):
        pass

# CarVisitor的visit方法接收Car类型参数
class CarVisitor(Visitor):
    def visit(self, car):
        print(f"printing from car visitor, visiting car: {car}")

# MotorcycleVisitor的visit方法接收Motorcycle类型参数
class MotorcycleVisitor(Visitor):
    def visit(self, motorcycle):
        print(f"printing from motorcycle visitor, visiting motorcycle: {motorcycle}")


vehicle1 = Car()
vehicle2 = Motorcycle()

visitor1 = CarVisitor()
visitor2 = MotorcycleVisitor()

vehicle1.accept(visitor1)
vehicle2.accept(visitor2)
关键修改点
  • 基类Visitor的visit方法新增vehicle参数,规范访问方法的统一接口
  • 子类CarVisitor和MotorcycleVisitor的visit方法分别接收对应类型的对象参数,既符合访问者模式“针对不同元素做不同操作”的设计,也解决了参数不匹配的问题
  • 修正了类名拼写错误:Vistor改为Visitor(符合命名规范,避免混淆)

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:12:11