ユーザーが言うと
print(the_object.the_dict['level1']['level2']['level3'])
Python はそれを評価the_object.the_dict['level1']['level2']['level3']し、(たとえば) dict であると判断し、それを に渡しprintます。
は dict であるためthe_object.the_dict、残りはthe_objectの制御外です。level1、level2、およびを掘り下げるとlevel3、 によって返されるオブジェクトのタイプのみが の動作the_object.the_dict['level1']['level2']['level3']に影響しますprint。the_objectの__str__メソッドは、それ自体以外には影響しませんthe_object。
さらに、ネストされたオブジェクトを印刷するときは、オブジェクトではなく、オブジェクトの をpprint.pformat使用します。reprstr
したがって、必要な動作を得るにはthe_object.the_dict['level1']['level2']['level3']、辞書のようなものに評価する必要がありますが、異なる__repr__...
dict のようなオブジェクト (例: Turtle) を作成し、最後まで使用できTurtlesます。
import collections
import pprint
class Turtle(collections.MutableMapping):
def __init__(self,*args,**kwargs):
self._data=dict(*args,**kwargs)
def __getitem__(self,key):
return self._data[key]
def __setitem__(self, key, value):
self._data[key]=value
def __delitem__(self, key):
del self._data[key]
def __iter__(self):
return iter(self._data)
def __len__(self):
return len(self._data)
def __contains__(self, x):
return x in self._data
def __repr__(self):
return pprint.pformat(self._data)
class MyObject(object):
def __init__(self):
self.the_dict=Turtle()
def __repr__(self):
return repr(self.the_dict)
the_object=MyObject()
the_object.the_dict['level1']=Turtle()
the_object.the_dict['level1']['level2']=Turtle()
the_object.the_dict['level1']['level2']['level3']=Turtle({i:i for i in range(20)})
print(the_object)
print(the_object.the_dict['level1']['level2']['level3'])
これを使用するには、ネストされた dict 構造内のすべての dict をTurtles に置き換える必要があります。
しかし、実際には (私の空想的な命名からわかるように)、Turtles を使用することは期待していません。辞書は非常に優れた、最適化されたビルトインです。きれいな印刷を行うためだけに、この中間オブジェクトを追加したくありません。
代わりに、ユーザーに入力するよう説得できる場合
from pprint import pprint
それから彼らはただ使うことができます
pprint(the_object.the_dict['level1']['level2']['level3'])
きれいな印刷を取得します。