Select Git revision
objektove.py
-
Martin Mareš authoredMartin Mareš authored
objektove.py 1.76 KiB
#!/usr/bin/python3
#
# V elementárním řešení bylo nešikovné, že implementace operátorů byla
# roztroušená po celém programu, takže přidat nový operátor vyžadovalo
# projít celý program.
#
# Zde ukazujeme, jak oddělit implementaci operátorů do samostatných tříd
# (odvozených od nějaké společné třídy Node).
#
class Node:
def eval(self):
raise NotImplemented()
class NumNode(Node):
def __init__(self, x):
self.value = x
def __str__(self):
return str(self.value)
def eval(self):
return self.value
class AddNode(Node):
def __init__(self, left, right):
self.left = left
self.right = right
def __str__(self):
return '(' + str(self.left) + '+' + str(self.right) + ')'
def eval(self):
return self.left.eval() + self.right.eval()
class SubNode(Node):
def __init__(self, left, right):
self.left = left
self.right = right
def __str__(self):
return '(' + str(self.left) + '-' + str(self.right) + ')'
def eval(self):
return self.left.eval() - self.right.eval()
class MulNode(Node):
def __init__(self, left, right):
self.left = left
self.right = right
def __str__(self):
return '(' + str(self.left) + '*' + str(self.right) + ')'
def eval(self):
return self.left.eval() * self.right.eval()
class DivNode(Node):
def __init__(self, left, right):
self.left = left
self.right = right
def __str__(self):
return '(' + str(self.left) + '/' + str(self.right) + ')'
def eval(self):
return self.left.eval() // self.right.eval()
x = AddNode(MulNode(NumNode(3), NumNode(4)), SubNode(NumNode(5), NumNode(6)))
print(x)
print(x.eval())