Python 为什么赢了';我不能拿走我的符号吗?

Python 为什么赢了';我不能拿走我的符号吗?,python,sympy,Python,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 constru

我对符号的定义如下:

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
矩阵时,它会引发一个错误,我无法找出原因:

import sympy
A= sympy.Matrix([[a],[b]])


....SympifyError: Sympify of expression 'could not parse u'<__main__.construct object at 0x1088a5ad0>'' failed, because of exception being raised:
SyntaxError: invalid syntax (<string>, line 1)
导入sympy
A=共矩阵([[A],[b]])
..SympifyError:表达式“无法分析u”“的Sympify失败,因为引发了异常:
SyntaxError:无效语法(,第1行)
我甚至没有在这里使用字符串,所以我不知道为什么它会抱怨解析错误。

错误消息中的
是默认的
构造返回的。\uu str\uu()
方法。我注意到,一旦该方法被返回
construct.value
的字符串表示形式的方法覆盖,那么任何使用
sympy.sympify()
(包括
sympy.Matrix()
)的方法都会接受它。我不知道现有的自定义对象是如何被Symphy转换的——可能有一种更理想的方法

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]])'
如果我只对Symphy类执行此操作,我将使用以下命令:

import sympy
a,b = sympy.symbols('a b')
a = 2
b = 10
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'
错误消息中的
是默认的
构造返回的内容。我注意到,一旦该方法被返回
construct.value
的字符串表示形式的方法覆盖,那么任何使用
sympy.sympify()
(包括
sympy.Matrix()
)的方法都会接受它。我不知道现有的自定义对象是如何被Symphy转换的——可能有一种更理想的方法

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]])'
如果我只对Symphy类执行此操作,我将使用以下命令:

import sympy
a,b = sympy.symbols('a b')
a = 2
b = 10
print(sympy.Matrix([[a],[b]])) # will output 'Matrix([[2], [10]])'

您需要对Symphy的类进行子类化,以创建要在Symphy中使用的新对象。通常,您可以将
函数
(用于定义函数,类似于
sin
log
)或
Expr
作为一般表达式的子类。该类应具有
args
属性,并可通过
obj.func(*obj.args)
重新创建(默认情况下,
obj.func
等于objects类)


我不能提供更多关于细节的建议,因为您提供的示例类非常简单,@Christopher Chavez指出,您可以使用一个符号。但是,根据您想要做什么,您可以在子类中重写各种方法。一个很好的参考是查看Symphy源代码,因为Symphy附带的所有对象都使用此模型

您需要对Symphy的类进行子类化,以创建一个新的对象在Symphy中使用。通常,您可以将
函数
(用于定义函数,类似于
sin
log
)或
Expr
作为一般表达式的子类。该类应具有
args
属性,并可通过
obj.func(*obj.args)
重新创建(默认情况下,
obj.func
等于objects类)


我不能提供更多关于细节的建议,因为您提供的示例类非常简单,@Christopher Chavez指出,您可以使用一个符号。但是,根据您想要做什么,您可以在子类中重写各种方法。一个很好的参考是查看Symphy源代码,因为Symphy附带的所有对象都使用此模型

好吧,我想这是因为我在课堂上没有使用
\uuu str\uuu
方法definition@guimption我仍然很好奇,为什么你想拥有自己的
构造
类,而不仅仅是使用Symphy类--Symphy是否缺少一些功能?这是我定义的实际类的简化Kay,我猜这是因为我在课堂上没有使用
\uuuu str\uuu
方法definition@guimption我仍然很好奇,为什么您希望拥有自己的
构造
类,而不仅仅是使用Symphy类--Symphy是否缺少一些功能?这是我所拥有的实际类的简化defined@guimption我还有更多对这个答案的信心比我提供的答案要高(这只是一个黑客攻击,因为我怀疑您的错误消息确实来自
。\uuu str\uuu()
),尽管这可能需要更多的工作,我对Symphy也不够熟悉,无法描述如何应用这个答案。是的,我想你的答案不会给我所有我需要的功能,谢谢@chrstphrchvzWait,@asmurer,你有什么理由不想子类化
Symbol
而不是
Expr
?我只是想知道…你也可以将Symbol子类化。符号不接受任何参数。这有点困难,因为您必须修改
\uuuuueq\uuuu
和散列。因为你的例子只是你正在做的事情的一个有限版本,所以很难说你应该做什么,但符号可能更适合你的目的。@guimption我对这个答案比我提供的答案更有信心(这只是一个基于我怀疑你的错误消息确实来自
。\uu str\uuuu()
),虽然这可能需要更多的工作,但我对Symphy也不太熟悉,无法描述如何应用此答案。是的,我认为您的答案不会提供我需要的所有功能。谢谢@chstphrchvzwait,@asmurer,您有什么理由不想将
Symbol
子类化,而不是
Expr
?我只是想知道…你也可以将Symbol子类化。符号不接受任何参数。这有点困难,因为您必须修改
\uuuuueq\uuuu
和散列。因为你们的例子只是你们正在做的事情的一个有限版本,所以很难说你们应该做什么,但符号可能更适合你们的目的。