Select Git revision
objektove2.py
objektove2.py 1.49 KiB
#!/usr/bin/python3
#
# Naše objektové řešení obsahovalo spoustu duplicitního kódu: speciálně
# všechny binární operátory měly identické metody __init__ a velmi podobné
# metody __str__ a eval.
#
# Zde se duplicit zbavíme tím, že je přesuneme do společného předka:
# třídy BinaryNode, která popisuje chování obecného binárního operátoru.
# Každý konkrétní operátor si pak pouze dodefinuje, jak se jmenuje a jaké
# funkci odpovídá.
#
class Node:
def eval(self):
raise NotImplementedError()
class NumNode(Node):
def __init__(self, x):
self.value = x
def __str__(self):
return str(self.value)
def eval(self):
return self.value
class BinaryNode(Node):
def __init__(self, left, right):
self.left = left
self.right = right
def __str__(self):
return '(' + str(self.left) + self.op_name + str(self.right) + ')'
def eval(self):
return self.eval_op(self.left.eval(), self.right.eval())
class AddNode(BinaryNode):
op_name = '+'
def eval_op(self, x, y):
return x + y
class SubNode(BinaryNode):
op_name = '-'
def eval_op(self, x, y):
return x - y
class MulNode(BinaryNode):
op_name = '*'
def eval_op(self, x, y):
return x * y
class DivNode(BinaryNode):
op_name = '/'
def eval_op(self, x, y):
return x // y
x = AddNode(MulNode(NumNode(3), NumNode(4)), SubNode(NumNode(5), NumNode(6)))
print(x)
print(x.eval())