visitor.py 848 B

1234567891011121314151617181920212223242526272829303132333435
  1. '''http://peter-hoffmann.com/2010/extrinsic-visitor-pattern-python-inheritance.html'''
  2. class Node(object): pass
  3. class A(Node): pass
  4. class B(Node): pass
  5. class C(A,B): pass
  6. class Visitor(object):
  7. def visit(self, node, *args, **kwargs):
  8. meth = None
  9. for cls in node.__class__.__mro__:
  10. meth_name = 'visit_'+cls.__name__
  11. meth = getattr(self, meth_name, None)
  12. if meth:
  13. break
  14. if not meth:
  15. meth = self.generic_visit
  16. return meth(node, *args, **kwargs)
  17. def generic_visit(self, node, *args, **kwargs):
  18. print('generic_visit '+node.__class__.__name__)
  19. def visit_B(self, node, *args, **kwargs):
  20. print('visit_B '+node.__class__.__name__)
  21. a = A()
  22. b = B()
  23. c = C()
  24. visitor = Visitor()
  25. visitor.visit(a)
  26. visitor.visit(b)
  27. visitor.visit(c)