背景:我正在使用jupyter笔记本中的SymPy模块。我想创建sympy的Matrix类的子/子类(实际上是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)
然后作业通过了。
现在,我仅在下一个单元格中运行它(为了简单起见,这就像执行Name一样)
X
得到了输出
<__main__.Mat at 0x7f80b77f8b80>
但我期待
[1 2 3]
要么
Matrix([[1, 2, 3]])
当我创建一个常规的sym.Matrix对象并执行它的Name时,分别是Jupyter Notebook和Python REPL中的输出
注:我知道的存在__str__
和__repr__
,但那些只是如果我使用有帮助print(X)
注意:我尝试将定义__call__
为
def __call__(self):
return self.a
但是它只有在我先执行X=X()
然后执行时才有效X
所以我的问题是,仅执行对象名称时调用的内部方法是什么(可能是魔术方法),以及如何为我的类定义它,如果将来我创建一个没有继承的类(因此我不会必须使用相同的超类方法)
通过查看文档,我们可以:
在Python中,对象可以使用_ repr _方法声明其文本表示形式。IPython扩展了这一思想,并允许对象声明其他丰富的表示形式,包括:
_repr_html_:将原始HTML作为字符串或元组返回(请参见下文)。
_repr_json_:返回JSONable字典或元组(请参见下文)。
_repr_jpeg_:返回原始JPEG数据或元组(请参见下文)。
_repr_png_:返回原始PNG数据或元组(请参见下文)。
_repr_svg_:以字符串或元组的形式返回原始SVG数据(请参见下文)。
_repr_latex_:以“ $”或元组(参见下文)包围的字符串返回LaTeX命令。
_repr_mimebundle_:返回包含映射的完整mimebundle
另外,这个SO问题似乎是相关的。
有效的代码段应类似于:
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>"
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句