Pythonでオブジェクトを印刷するための標準的な規則はありますか? オブジェクトを印刷しようとするとメモリアドレスが印刷されることはわかっていますが、そのメソッドを上書きして、デバッグに役立つオブジェクトの人間が読める形式を印刷できるようにしたいと考えています。
人々が従う標準的な規則はありますか、それともそのような方法を定義するのは良い方法ではありませんか?代わりに、より良い代替手段がありますか?
Pythonでオブジェクトを印刷するための標準的な規則はありますか? オブジェクトを印刷しようとするとメモリアドレスが印刷されることはわかっていますが、そのメソッドを上書きして、デバッグに役立つオブジェクトの人間が読める形式を印刷できるようにしたいと考えています。
人々が従う標準的な規則はありますか、それともそのような方法を定義するのは良い方法ではありませんか?代わりに、より良い代替手段がありますか?
__str__
または__repr__
メソッドのいずれかを上書きできます。
メソッドの実装方法に関する規則はありません__str__
。必要な人間が読める文字列表現を返すことができます。ただし、メソッドの実装方法には規則が__repr__
あります。オブジェクトの文字列表現を返して、(可能であれば) オブジェクトをその表現から再作成できるようにする必要がありますeval(repr(obj)) == obj
。
Point
classが__str__
あり、次の__repr__
ように実装できると仮定します。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __str__(self):
return "(%.2f, %.2f)" % (self.x, self.y)
def __repr__(self):
return "Point(x=%r, y=%r)" % (self.x, self.y)
def __eq__(self, other):
return isinstance(other, Point) and self.x == other.x and self.y == other.y
例:
>>> p = Point(0.1234, 5.6789)
>>> str(p)
'(0.12, 5.68)'
>>> "The point is %s" % p # this will call str
'The point is (0.12, 5.68)'
>>> repr(p)
'Point(x=0.1234, y=5.6789)'
>>> p # echoing p in the interactive shell calls repr internally
Point(x=0.1234, y=5.6789)
>>> eval(repr(p)) # this echos the repr of the new point created by eval
Point(x=0.1234, y=5.6789)
>>> type(eval(repr(p)))
<class '__main__.Point'>
>>> eval(repr(p)) == p
True
__str__
印刷するオブジェクトのクラスに 関数を実装します。
変更できないクラスのオブジェクトを出力している場合print
、Python 3 を使用しているため、独自の関数を提供するのはかなり簡単です。
編集:通常、によって返される文字列は__str__
クラスに固有ですが、少なくともオブジェクトを識別するには十分です。文字列の正確な形式は、クラスおよびパブリック属性によって異なります。
Edit2: これは、国を説明するクラスからの簡単な (カットダウン) 例です。
def __str__(self):
return "{0:<32} {1:>010}".
format(self.__name, self.__population)
オブジェクトを再現できる方法で表現できる場合は、__repr__
関数をオーバーライドします。たとえば、次のコードを使用してオブジェクトを作成できる場合:
MyObject('foo', 45)
__repr__
を返す必要があります"MyObject('foo', 45)"
。その場合、を実装する必要はありません__str__
。
ただし、オブジェクトが非常に複雑でそのように表現できない場合は、__str__
代わりにオーバーライドしてください。次に、オブジェクトを再作成できないことと、それがオブジェクトであることの両方を明確にするものを返す必要があります。したがって、を返さないでください"foo:45"
。文字列のように見える{'foo': 45}
ため、または辞書のように見えるため、デバッグ時に混乱する可能性があります。
たとえば、ブラケットを保持することをお勧めします<MyObject foo:45>
。そうすれば、オブジェクトを印刷していることは明らかです。またMyObject('foo', 45)
、オブジェクトを再作成するための書き込みの問題だけでなく、より多くのデータが保存されていることも明らかです。
オブジェクト (クラス インスタンス) に関するカスタム情報を出力する標準的な方法は、__str__
メソッドを使用することです。
class A:
var = 1
def __str__(self):
return 'Accessing from print function, var = {0}'.format(self.var)
この方法では、必要な情報を表示できます
a = A()
print(a)
>>> Accessing from print function, var = 1