Python 3.x 在Sympy中定义新的逻辑运算

Python 3.x 在Sympy中定义新的逻辑运算,python-3.x,sympy,logical-operators,Python 3.x,Sympy,Logical Operators,我一直在阅读Symphy的源代码,试图找出是否可以添加自己的逻辑操作。这是定义逻辑操作的地方: 是否可以不修改库本身? 我假设我需要创建一个扩展BooleanFunction的类,但在这段代码中: class Boolean(Basic): """A boolean object is an object for which logic operations make sense.""" __slots__ = [] def __and__(self, other)

我一直在阅读Symphy的源代码,试图找出是否可以添加自己的逻辑操作。这是定义逻辑操作的地方:

是否可以不修改库本身? 我假设我需要创建一个扩展BooleanFunction的类,但在这段代码中:

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__
类布尔值(基本):
“”“布尔对象是逻辑操作有意义的对象。”“”
__插槽u=[]
定义和(自身、其他):
“”“运算符的重载(&O)”
返回和(自身、其他)
__rand_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和__
定义或(自身、其他):
“为|重载”
返回或(自身、其他)
__ror\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu__
定义反转(自):
“正在为~”加载重载
不返回(自身)
def u r换档(自身、其他):
“”“为>>加载重载”“”
返回意味着(自我、其他)
def u l换档(自身、其他):

“”“为重载时,您应该将
sympy.logic.boolalg.BooeanFunction子类化
(如果您的对象不是函数,则只需
布尔值
).BooleanFunction本身是Function的子类,这意味着您使用与Function相同的行为来定义其操作,即定义classmethod
eval
,当您希望对象求值时,该方法返回值,而当对象应保持未求值时,则不返回值。例如,请参见的定义

如果您的操作是一个晶格操作符(as和Or是),那么还可以使用LatticeOp,这简化了它们的定义

至于操作符本身,如果你想重载一个操作符,在你的类上为它定义
\uuuuu方法\uuuu
。Python只允许重载某些操作符,你不能改变它们的优先级,因此根据你的操作符是什么,你可能无法为它定义一个合理的操作符,在这种情况下,你需要使用函数表示法