SymPy Matrix子类及自定义类在REPL/Jupyter中的对象显示方法
问题解答:SymPy Matrix子类化与Jupyter对象显示
一、先解决你继承sympy.Matrix时的错误
你原来的子类代码里super(a)的用法完全错误,super()的参数应该是类和实例(Python3中可以省略参数直接调用super()),用来调用父类的方法。而且SymPy的Matrix(实际是MutableDenseMatrix)的初始化逻辑需要正确传递参数给父类。
正确的子类化写法应该是这样的:
import sympy as sym class Mat(sym.MutableDenseMatrix): def __init__(self, a): # 调用父类的初始化方法,传入矩阵数据 super().__init__(a)
或者更严谨的,因为SymPy的矩阵类在__new__方法中处理实例创建,你也可以重写__new__:
class Mat(sym.MutableDenseMatrix): def __new__(cls, a): return super().__new__(cls, a)
这样创建X=Mat([[1,2,3]])就不会报错了,而且直接执行X会自动继承父类的显示逻辑。
二、非继承类中实现Jupyter直接显示矩阵的方法
你提到的“直接执行对象名时调用的魔法方法”分两种场景:
- 在Python终端REPL中,直接输入对象名回车,触发的是
__repr__方法; - 在Jupyter Notebook/Lab中,直接显示对象时,优先触发
__repr_html__方法(这是Jupyter特有的魔法方法,用来生成HTML格式的显示内容),如果没有实现这个方法,才会 fallback 到__repr__。
SymPy的Matrix同时实现了这两个方法,所以在Jupyter里能显示成美观的表格,在REPL里显示成Matrix([[1, 2, 3]])的格式。
要让你的非继承类实现同样的效果,只需要把内部sym.Matrix对象的对应方法结果返回即可:
import sympy as sym class Mat: def __init__(self, a): self.a = sym.Matrix(a) # 处理REPL和Jupyter的基础文本显示 def __repr__(self): return repr(self.a) # 处理Jupyter的HTML美化显示 def __repr_html__(self): return self.a._repr_html_() # 如果需要print(X)也显示正确的文本格式,可以重写__str__ def __str__(self): return str(self.a)
现在你创建X=Mat([[1,2,3]])后,直接执行X:
- 在Jupyter里会显示和SymPy Matrix一样的表格;
- 在REPL里会显示
Matrix([[1, 2, 3]]); - 执行
print(X)也会输出[1 2 3]。
你之前尝试的__call__方法是错误的方向,__call__是当你把对象当作函数调用时才会触发(比如X()),和直接显示对象毫无关系。
内容的提问来源于stack exchange,提问作者Nick OZ
相关产品推荐
相关产品推荐

