使用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
相关产品推荐
相关产品推荐

