当一个类的对象在没有任何括号的情况下被输入并运行时,它是如何在Python REPL或Jupyter笔记本中打印出来的

当一个类的对象在没有任何括号的情况下被输入并运行时,它是如何在Python REPL或Jupyter笔记本中打印出来的,python,jupyter-notebook,read-eval-print-loop,Python,Jupyter Notebook,Read Eval Print Loop,背景:我正在jupyter笔记本电脑中使用SymPy模块。我想创建sympy的矩阵类的子/子类(实际上是sympy.Matrix.dense.MutableDenseMatrix) 我写这个=> import sympy as sym class Mat(sym.Matrix): def __init__(self,a): self.a = super(a) 然后我在一个单独的单元格中调用以下内容 X=Mat([[1,2,3]]) 这是一个错误 TypeError

背景:我正在jupyter笔记本电脑中使用SymPy模块。我想创建sympy的矩阵类的子/子类(实际上是sympy.Matrix.dense.MutableDenseMatrix)

我写这个=>

import sympy as sym
class Mat(sym.Matrix):
  def __init__(self,a):
    self.a = super(a)
然后我在一个单独的单元格中调用以下内容

X=Mat([[1,2,3]])
这是一个错误

TypeError                                 
Traceback (most recent call last)
<ipython-input-154-9d0dfad5081f> in <module>
----> 1 X= Mat([[1,2,3]])

<ipython-input-153-41d7b2cc4dd1> in __init__(self, a)
      1 class Mat(sym.Matrix):
      2     def __init__(self,a):
----> 3         self.a = super(a)

TypeError: super() argument 1 must be type, not list
然后任务通过了

现在,我在下一个单元格中单独运行了它(假设为简单起见,这就像执行名称一样)

并且得到了输出

<__main__.Mat at 0x7f80b77f8b80>

当我创建一个常规的sym.Matrix对象并只执行它的Name

注意:我知道存在
\uuuu str\uuuuuu
\uuuuu repr\uuuuuu
但只有当我使用
打印(X)

注意:我尝试将
\uuuuu call\uuuuu
定义为

def __call__(self):
  return self.a
但只有先执行
X=X()
然后执行
X

所以我的问题是,当只执行对象名时调用的内部方法(可能是一个神奇的方法)是什么?如果将来我创建一个没有继承的类(这样我就不必为相同的类使用超类方法),我该如何为我的类定义它

在Python中,对象可以使用 _报告方法。IPython扩展了这一思想,允许对象声明其他丰富的表示,包括:

_repr_html_:以字符串或元组形式返回原始html(见下文)

_repr_json_:返回一个可使用JS的dict或元组(见下文)

_repr_jpeg_:返回原始jpeg数据或元组(见下文)

_repr_png_:返回原始png数据或元组(见下文)

_repr_svg_:以字符串或元组形式返回原始svg数据(见下文)

_repr_latex_:返回由“$”或元组包围的字符串中的latex命令(见下文)

_repr\u mimebundle\返回包含映射的完整mimebundle

作为一个补充似乎是相关的

工作代码段应类似于:

import sympy as sym
class Mat(sym.Matrix):
  def __init__(self,a):
    self.a = sym.Matrix(a)
  def _repr_html_(self):
        return f"<p><h1>{self.a.__repr__()}</h1></p>"
将sympy作为sym导入
类别矩阵(符号矩阵):
定义初始化(self,a):
自身a=对称矩阵(a)
定义报告html(自我):
返回f“{self.a.\u repr\u()}

这将产生类似的输出:

这个建议很有效,你能告诉我为什么会出现第一个错误吗?根据Symphy文档,我们使用矩阵(arg)创建一个矩阵对象。那么,我的继承不是正确的吗?找到了第一个错误的修复方法,多亏了你,它使我找到了另一个解决方案
类Mat(sym.Matrix):def\uu init\uuuuuu(self,a):self=sym.Matrix(a)
解决了第一个错误抱歉,我不在家。我很高兴你解决了它!
[1 2 3]
Matrix([[1, 2, 3]])
def __call__(self):
  return self.a
import sympy as sym
class Mat(sym.Matrix):
  def __init__(self,a):
    self.a = sym.Matrix(a)
  def _repr_html_(self):
        return f"<p><h1>{self.a.__repr__()}</h1></p>"