Skip to content

Commit bcaa897

Browse files
author
Sakis Kasampalis
committed
visitor to python3
1 parent 00028ad commit bcaa897

File tree

1 file changed

+26
-30
lines changed

1 file changed

+26
-30
lines changed

visitor.py

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,34 @@
11
'''http://peter-hoffmann.com/2010/extrinsic-visitor-pattern-python-inheritance.html'''
22

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
117

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
1816

19-
if meth:
20-
break
17+
if not meth:
18+
meth = self.generic_visit
19+
return meth(node, *args, **kwargs)
2120

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__)
2423

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__)
2726

28-
def generic_visit(self, node, *args, **kwargs):
29-
print 'generic_visit '+node.__class__.__name__
3027

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

Comments
 (0)