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