2016-09-06 3 views
1

Я читал исходный код Sympy, чтобы попытаться выяснить, могу ли я добавить свою собственную логическую операцию. Здесь определяются логические операции: https://github.com/sympy/sympy/blob/master/sympy/logic/boolalg.pyОпределите новую логическую операцию в Sympy

Возможно ли без изменения самой библиотеки? Я предполагаю, что мне нужно создать класс, который расширяет Булева функция, но тогда в этом фрагменте кода:

class Boolean(Basic): 
    """A boolean object is an object for which logic operations make sense.""" 

    __slots__ = [] 

    def __and__(self, other): 
     """Overloading for & operator""" 
     return And(self, other) 

    __rand__ = __and__ 

    def __or__(self, other): 
     """Overloading for |""" 
     return Or(self, other) 

    __ror__ = __or__ 

    def __invert__(self): 
     """Overloading for ~""" 
     return Not(self) 

    def __rshift__(self, other): 
     """Overloading for >>""" 
     return Implies(self, other) 

    def __lshift__(self, other): 
     """Overloading for <<""" 
     return Implies(other, self) 

    __rrshift__ = __lshift__ 
    __rlshift__ = __rshift__ 

    def __xor__(self, other): 
     return Xor(self, other) 

    __rxor__ = __xor__ 

Как я могу добавить новую операцию, не изменяя класс?

ответ

1

Вы должны подкласс sympy.logic.boolalg.BooeanFunction (или просто Boolean, если ваш объект не будет функцией). BooleanFunction - это подклассы из Function, что означает, что вы используете то же поведение, что и Function для определения определения его операции, а именно: define classmethod eval, который возвращает значения, когда вы хотите, чтобы объект оценивался, и None, когда он должен оставаться неоцененным. См., Например, определение Not.

Если ваша операция является решеточным оператором (как And и Or), вы также можете использовать LatticeOp, что упрощает их определение.

Что касается самого оператора, если вы хотите перегрузить оператор, определите __method__ для него на вашем классе. Python позволяет только перегрузить определенный specific operators, и вы не можете изменить их приоритет, поэтому в зависимости от того, что ваш оператор, не может быть разумного оператора, который вы можете определить для него, и в этом случае вам нужно будет использовать нотацию функции ,

+0

ОК получил, спасибо! – Lana