当用户说
print(the_object.the_dict['level1']['level2']['level3'])
Python 评估the_object.the_dict['level1']['level2']['level3']
并(假设)发现它是一个 dict,并将其传递给print
.
由于the_object.the_dict
是 dict,其余部分the_object
不受控制。当您深入了解level1
、level2
和level3
时,只有返回的对象类型the_object.the_dict['level1']['level2']['level3']
会影响print
行为方式。the_object
的__str__
方法不会影响the_object
自身以外的任何事物。
此外,在打印嵌套对象时,pprint.pformat
使用repr
对象的,而不是str
对象的。
因此,为了获得我们想要的行为,我们需要the_object.the_dict['level1']['level2']['level3']
评估类似 dict 但具有不同__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 替换为Turtle
s。
但实际上(正如你可以从我的奇思妙想中看出的那样),我真的不希望你使用Turtle
s。字典是非常好的、优化的内置函数,我不想添加这个中间对象只是为了实现漂亮的打印。
如果相反,您可以说服您的用户键入
from pprint import pprint
然后他们可以使用
pprint(the_object.the_dict['level1']['level2']['level3'])
获得漂亮的打印效果。