Skip to content

Instantly share code, notes, and snippets.

@atsuya046
Created March 13, 2014 14:07
Show Gist options
  • Save atsuya046/9529150 to your computer and use it in GitHub Desktop.
Save atsuya046/9529150 to your computer and use it in GitHub Desktop.
GoF design pattern with Python - Visitor
"""http://peter-hoffmann.com/2010/extrinsic-visitor-pattern-python-inheritance.html"""
class Node(object):
pass
class A(Node):
pass
class B(Node):
pass
class C(A, B):
pass
class Visitor(object):
def visit(self, node, *args, **kwargs):
meth = None
for cls in node.__class__.__mro__:
meth_name = 'visit_' + cls.__name__
meth = getattr(self, meth_name, None)
if meth:
break
if not meth:
meth = self.generic_visit
return meth(node, *args, **kwargs)
def generic_visit(self, node, *args, **kwargs):
print('generic_visit ' + node.__class__.__name__)
def visit_B(self, node, *args, **kwargs):
print('visit_B ' + node.__class__.__name__)
a = A()
b = B()
c = C()
visitor = Visitor()
visitor.visit(a)
visitor.visit(b)
visitor.visit(c)
@thnd23
Copy link

thnd23 commented Sep 25, 2019

Why not just: visitor = getattr(self, method, self.generic_visit) as in default ast library?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment