| 123456789101112131415161718192021222324252627282930313233343536373839 |
- '''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
- meth = self.generic_visit
- return meth(node, *args, **kwargs)
- def visit_B(self, node, *args, **kwargs):
- print 'visit_B '+node.__class__.__name__
- def generic_visit(self, node, *args, **kwargs):
- print 'generic_visit '+node.__class__.__name__
- if __name__ == '__main__':
- a = A()
- b = B()
- # c = C()
- visitor = Visitor()
- visitor.visit(a)
- visitor.visit(b)
- # visitor.visit(c)
|