Python 3方法调用判定及Visitor模式代码解析求助
解析你的Visitor模式代码中方法调用逻辑
我来一步步帮你拆解这段代码的执行流程,搞清楚Visitor.visitA里的x.accept(self)到底会触发哪个方法。
首先得明确:Python是动态类型语言,方法调用完全基于对象的实际类型(而非变量的声明类型),这就是多态的核心体现,也是理解这段代码的关键。
我们分三种场景逐一分析:
场景1:x是A类的实例
假设你运行了这段代码:
a = A() v = Visitor() v.visitA(a)
执行流程是:
- 调用
v.visitA(a),此时方法里的x就是A类实例a,self是Visitor实例v - 执行
x.accept(self)→ 也就是a.accept(v),这会调用A类的accept方法 - A类的accept方法里执行
v.visitA(self)→ 这里的self是A类实例a,所以又回到v.visitA(a),形成无限递归
这种情况下,x.accept(self)间接调用的是Visitor的visitA方法。
场景2:x是B类的实例
如果运行的是这段代码:
b = B() v = Visitor() v.visitA(b) # 注意这里调用的是visitA,但传入的是B类实例
执行流程是:
- 调用
v.visitA(b),x是B类实例b,self是Visitor实例v - 执行
x.accept(self)→b.accept(v),因为B类重写了accept方法,所以调用B类的accept方法 - B类的accept方法里执行
v.visitB(self)→ 这里的self是B类实例b,所以调用Visitor的visitB方法
这种情况下,x.accept(self)间接调用的是Visitor的visitB方法。
场景3:x是C类的实例
如果运行v.visitA(C())(虽然这不符合Visitor模式的设计逻辑,但我们看执行流程):
- 调用
v.visitA(C()),x是C类实例 - 执行
x.accept(self)→C().accept(v),调用C类的accept方法 - C类的accept方法执行
v.visitC(self),所以调用Visitor的visitC方法
额外提醒:你的代码存在小问题
正常的Visitor模式中,visitA方法应该是处理A类实例的业务逻辑,而不是再调用x.accept(self)——否则传入A类实例就会无限递归。比如标准的写法应该是:
class Visitor: def visitA(self, x): print("处理A类实例的逻辑") def visitB(self, x): print("处理B类实例的逻辑") def visitC(self, x): print("处理C类实例的逻辑")
内容的提问来源于stack exchange,提问作者Lệ Trâm
相关产品推荐
相关产品推荐

