2017-06-12 48 views
0

我想存储和工作(从表达式和进一步访问每个文字)像Python((A/B)/ C)的逻辑表达式。我找到了一个办法。我张贴下面的代码。但作为初学者,我无法理解它。任何人都可以向我解释这段代码如何工作并给出所需的输出。原谅我的任何错误,因为这是我第一次使用stackoverflow。了解Python代码来实现逻辑表达式

class Element(object): 

    def __init__(self, elt_id, elt_description=None): 
     self.id = elt_id 
     self.description = elt_description 
     if self.description is None: 
      self.description = self.id 

    def __or__(self, elt): 
     return CombinedElement(self, elt, op="OR") 

    def __and__(self, elt): 
     return CombinedElement(self, elt, op="AND") 

    def __invert__(self): 
     return CombinedElement(self, op="NOT") 

    def __str__(self): 
     return self.id 

class CombinedElement(Element): 

    def __init__(self, elt1, elt2=None, op="NOT"): 
     # ID1 
     id1 = elt1.id 
     if isinstance(elt1, CombinedElement): 
      id1 = '('+id1+')' 
     # ID2 
     if elt2 is not None: 
      id2 = elt2.id 
      if isinstance(elt2, CombinedElement): 
       id2 = '('+id2+')' 
     # ELT_ID 
     if op == "NOT" and elt2 is None: 
      elt_id = "~"+id1 
     elif op == "OR": 
      elt_id = id1+" v "+id2 
     elif op == "AND": 
      elt_id = id1+"^"+id2 
     # SUPER 
     super(CombinedElement, self).__init__(elt_id) 

a = Element("A") 
b = Element("B") 
c = Element("C") 
d = Element("D") 
e = Element("E") 

print(a&b|~(c&d)|~e) 

Output : 

((A^B) v (~(C^D))) v (~E) 

回答

0

它可以通过设置类Element和定义位运算符& |~返回你请求的操作的字符串表示。

通常,~a是对整数的按位运算:它将所有0位更改为1,反之亦然。但由于运营商__invert__已经被重新定义,当你做到这一点

a = Element("A") 
print(~a) 

不是得到的a按位逆的,你会与一个整数,你得到的字符串"~A"

这很聪明,但我怀疑它不会对你想要做的事很有用。它所做的只是将一个表达式转换为一个字符串。