如何在 Python 混入中实现 _repr_pretty?

How to implement _repr_pretty in a Python mixin?

在此 之后,我尝试将 _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 移动到混入中,它就不再起作用了:

>>> 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.

有什么想法吗?

其实这不是bug,是一个特性...这里解释一下:

总而言之,当您在子 class 中编写自己的 __repr__ 时,它优先于父 class 的 _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.