Topics

I will let the code do the talking here. With OOP, one can add more AST methods and subclasses for the below toy calculator program, as the needs grow. Without OOP, I would have to do many if or isinstance checks to perform the right operation based on the operator.

class Node:
    def evaluate(self):
        raise NotImplementedError
 
    def pretty(self):
        raise NotImplementedError
 
class Integer(Node):
    def __init__(self, value):
        self.value = value
 
    def evaluate(self):
        return self.value
 
    def pretty(self):
        return repr(self.value)
 
class Add(Node):
    def __init__(self, l, r):
        self.l = l
        self.r = r
 
    def evaluate(self):
        return self.l.evaluate() + self.r.evaluate()
 
    def pretty(self):
        pretty_l = self.l.pretty()
        pretty_r = self.r.pretty()
        return f"({pretty_l} + {pretty_r})"
 
# Similarly can have `Multiply`, `Divide` and other ops
class Mul(Node):
    ...
 
class Div(Node):
    ...
 
tree = Add(Add(Integer(3), Integer(4)), Integer(5))
print(tree.pretty()) # ((3 + 4) + 5)
print(tree.evaluate()) # 12