[此discussion之后,我试图在混入中包括_repr_pretty
。
没有mixin,它可以按预期工作:
>>> class MyClass():
... def __repr__(self):
... return "The Repr."
... def __str__(self):
... return "The str."
... def _repr_pretty_(self, p, cycle):
... p.text(str(self) if not cycle else '...')
>>> my_object = MyClass()
>>> my_object
The str.
但是如果我将_repr_pretty
移入mixin,它将不再起作用:
>>> class MyMixin:
... def _repr_pretty_(self, p, cycle):
... p.text(str(self) if not cycle else '...')
>>> class MyClass(MyMixin):
... def __repr__(self):
... return "The Repr."
... def __str__(self):
... return "The str."
>>> my_object = MyClass()
>>> my_object
The Repr.
有什么想法吗?
事实上,这不是错误,而是功能。在这里进行解释:
总而言之,当您在子类中编写自己的__repr__
时,它优先于父类的_repr_pretty_
。其背后的原理是,在这种情况下,您通常还希望IPython漂亮打印机也使用自定义__repr__
方法。
这里是一种可能的解决方法:
>>> class MyMixin:
>>> def _my_repr_(self):
... raise NotImplementedError
>>> def __repr__(self):
... return self._my_repr_()
>>> def _repr_pretty_(self, p, cycle):
... p.text(str(self) if not cycle else '...')
>>> class MyClass(MyMixin):
... def __init__(self):
... super().__init__()
... def _my_repr_(self):
... return "The Repr."
... def __str__(self):
... return "The str."
>>> my_object = MyClass()
>>> my_object
The str.