__repr__()
クラスのデフォルトがあまり有益ではないことは私を悩ませます:
>>> class Opaque(object): pass
...
>>> Opaque()
<__main__.Opaque object at 0x7f3ac50eba90>
...だから私はそれを改善する方法を考えてきました。pickle
少し検討した後、プロトコルの__getnewargs__()
メソッドを活用するこの抽象基本クラスを思いつきました。
from abc import abstractmethod
class Repro(object):
"""Abstract base class for objects with informative ``repr()`` behaviour."""
@abstractmethod
def __getnewargs__(self):
raise NotImplementedError
def __repr__(self):
signature = ", ".join(repr(arg) for arg in self.__getnewargs__())
return "%s(%s)" % (self.__class__.__name__, signature)
その使用法の簡単な例を次に示します。
class Transparent(Repro):
"""An example of a ``Repro`` subclass."""
def __init__(self, *args):
self.args = args
def __getnewargs__(self):
return self.args
...そして結果として生じるrepr()
振る舞い:
>>> Transparent("an absurd signature", [1, 2, 3], str)
Transparent('an absurd signature', [1, 2, 3], <type 'str'>)
>>>
これで、Pythonがデフォルトでこれをすぐに行わない理由の1つがわかります。すべてのクラスにメソッドを定義するように要求することは、メソッド__getnewargs__()
を定義することを期待する(ただし要求しない)よりも負担が大きくなります__repr__()
。
私が知りたいのは、それはどれほど危険で壊れやすいのかということです。一方で、Repro
インスタンスにそれ自体が含まれている場合、無限の再帰が発生することを除いて、ひどく間違っている可能性のあるものは考えられません...しかし、上記のコードを醜くするという犠牲を払って、それは解決可能です。
他に何を逃しましたか?