如何在Python mixin中实现_repr_pretty?

问题描述 投票:0回答:1

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

有什么想法吗?

ipython mixins repr
1个回答
0
投票

事实上,这不是错误,而是功能。在这里进行解释:

总而言之,当您在子类中编写自己的__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.
© www.soinside.com 2019 - 2024. All rights reserved.