class 的对象如何在 Python REPL 或 Jupyter Notebook 中打印时输入 运行 而没有任何括号
How does an Object of a class get printed in the Python REPL or Jupyter Notebook when it is entered and run without any parenthesis
背景:我正在使用 jupyter 笔记本中的 SymPy 模块。我想创建一个 sub/child class 的 Matrix class of sympy(实际上是 sympy.matrices.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
不知道是什么原因,我尝试了这个
class Mat:
def __init__(self,a):
self.a = sym.Matrix(a)
那么作业就通过了
现在我 运行 单独在 Next Cell 中执行此操作(为了简单起见,假设这就像只是执行 Name)
X
并得到输出
<__main__.Mat at 0x7f80b77f8b80>
但我在期待
[1 2 3]
或
Matrix([[1, 2, 3]])
这些是 Jupyter Notebook 和 Python REPL 分别在我创建一个常规 sym.Matrix 对象并执行它时的输出 Name
注意:我知道 __str__
和 __repr__
的存在,但它们只有在我使用 print(X)
时才有用
注意:我尝试将 __call__
定义为
def __call__(self):
return self.a
但它只有在我先执行 X=X()
然后执行 X
时才有效
所以我的问题是,仅执行对象 Name 时调用的内部方法(可能是魔法方法)是什么以及如何为我的 class,如果将来我创建一个没有继承的 class(这样我就不必回退到超级 class 方法)
通过查看 at the doc 我们有:
In Python, objects can declare their textual representation using the
_repr_ method. IPython expands on this idea and allows objects to declare other, rich representations including:
_repr_html_: return raw HTML as a string, or a tuple (see below).
_repr_json_: return a JSONable dict, or a tuple (see below).
_repr_jpeg_: return raw JPEG data, or a tuple (see below).
_repr_png_: return raw PNG data, or a tuple (see below).
_repr_svg_: return raw SVG data as a string, or a tuple (see below).
_repr_latex_: return LaTeX commands in a string surrounded by “$”, or a tuple (see below).
_repr_mimebundle_: return a full mimebundle containing the mapping
作为补充 似乎是相关的。
一个工作片段应该是这样的:
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>"
结果类似:
背景:我正在使用 jupyter 笔记本中的 SymPy 模块。我想创建一个 sub/child class 的 Matrix class of sympy(实际上是 sympy.matrices.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
不知道是什么原因,我尝试了这个
class Mat:
def __init__(self,a):
self.a = sym.Matrix(a)
那么作业就通过了
现在我 运行 单独在 Next Cell 中执行此操作(为了简单起见,假设这就像只是执行 Name)
X
并得到输出
<__main__.Mat at 0x7f80b77f8b80>
但我在期待
[1 2 3]
或
Matrix([[1, 2, 3]])
这些是 Jupyter Notebook 和 Python REPL 分别在我创建一个常规 sym.Matrix 对象并执行它时的输出 Name
注意:我知道 __str__
和 __repr__
的存在,但它们只有在我使用 print(X)
注意:我尝试将 __call__
定义为
def __call__(self):
return self.a
但它只有在我先执行 X=X()
然后执行 X
所以我的问题是,仅执行对象 Name 时调用的内部方法(可能是魔法方法)是什么以及如何为我的 class,如果将来我创建一个没有继承的 class(这样我就不必回退到超级 class 方法)
通过查看 at the doc 我们有:
In Python, objects can declare their textual representation using the _repr_ method. IPython expands on this idea and allows objects to declare other, rich representations including:
_repr_html_: return raw HTML as a string, or a tuple (see below).
_repr_json_: return a JSONable dict, or a tuple (see below).
_repr_jpeg_: return raw JPEG data, or a tuple (see below).
_repr_png_: return raw PNG data, or a tuple (see below).
_repr_svg_: return raw SVG data as a string, or a tuple (see below).
_repr_latex_: return LaTeX commands in a string surrounded by “$”, or a tuple (see below).
_repr_mimebundle_: return a full mimebundle containing the mapping
作为补充
一个工作片段应该是这样的:
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>"
结果类似: