我的符号定义如下:
type login struct {
Seq uint8
ID uint16
Username [16]byte
Password [16]byte
Unknown1 [16]byte
}
(上面的代码是可运行的)。现在,当我尝试将它们放在import sympy
class construct(object):
def __init__(self, value):
self.value = value
def __add__(self, symbol):
return construct(self.value+symbol.value)
def __mul__(self,symbol):
return construct(self.value*symbol.value)
a = construct(2)
b = construct(10)
矩阵中时,它会引发错误,我无法弄清楚原因:
sympy
我根本不在这里使用字符串,所以我不确定为什么它会抱怨解析错误。
答案 0 :(得分:1)
错误消息中的<__main__.construct object at 0x1088a5ad0>
是默认construct.__str__()
方法返回的内容。我注意到,一旦该方法被一个返回construct.value
的字符串表示的方法覆盖,那么使用sympy.sympify()
(包括sympy.Matrix()
)的任何内容都会接受它。我不知道这是SymPy想要转换现有自定义对象的方式 - 可能有更理想的方式。
import sympy
class construct(object):
def __init__(self, value):
self.value = value
def __add__(self, symbol):
return construct(self.value+symbol.value)
def __mul__(self,symbol):
return construct(self.value*symbol.value)
def __str__(self):
return str(self.value)
a = construct(2)
b = construct(10)
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'
如果我只使用SymPy类这样做,我会使用以下内容:
import sympy
a,b = sympy.symbols('a b')
a = 2
b = 10
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'
答案 1 :(得分:1)
您需要将SymPy的类子类化,以创建在SymPy中使用的新对象。通常,您将Function
(用于定义函数,类似于sin
或log
)或Expr
作为一般表达式的子类。该类应具有args
属性,并且可以使用obj.func(*obj.args)
进行重新计算(默认情况下obj.func
等于对象类。)
我无法提供更多有关细节的建议,因为您提供的示例类非常简单,正如@Christopher Chavez指出的那样,您可以使用符号。但是根据您想要做的事情,您可以在子类中覆盖各种方法。一个很好的参考是查看SymPy源代码,因为SymPy附带的所有对象都使用此模型。