Skip to content
Snippets Groups Projects
Select Git revision
  • 94dc9c82ad9e7ee88fec9ba7e450df57a07e67dd
  • master default
  • ls2021
  • ls1920
4 results

objektove2.py

Blame
  • Martin Mares's avatar
    Martin Mareš authored
    Za Python modernější!
    94dc9c82
    History
    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())