visitable.py 389 B

12345678910111213141516
  1. import abc
  2. class Visitor:
  3. @abc.abstractmethod
  4. def default(self):
  5. pass
  6. class Visitable:
  7. def accept(self, visitor: Visitor):
  8. typename = type(self).__qualname__.replace(".", "_")
  9. lookup = "visit_" + typename
  10. if hasattr(visitor, lookup):
  11. return getattr(visitor, lookup)(self)
  12. else:
  13. return visitor.default(typename)