如何在 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.
在此 _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.