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

objektove.py

Blame
  • 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())