我有一个表示接口的抽象基类。此类的子类存储为此类的其他子类的属性。嵌套类实例的有用默认__repr__
例如:
class AbstractBase(object):
pass
class Child(AbstractBase):
def __init__(self, cls1, cls2):
assert isinstance(cls1, AbstractBase)
assert isinstance(cls2, AbstractBase) # just to show they're instances
self.cls1 = cls1
self.cls2 = cls2
层次结构的深度和布局不能预先知道,但不会是递归的。
我可以把__repr__
放在AbstractBase
上,这样我就可以用一种有用的方式看到每个孩子课堂的特点吗?
我目前的做法是:
from pprint import pformat
class AbstractBase(object):
def __repr__(self):
return self.__class__.__name__ + '\n' \
+ pformat({k:v for k,v in self.__dict__.iteritems()
if not '__' in k})
对于基类(没有性能,这是的AbstractBase
子类,这样输出的东西可读,例如:与AbstractBase
MyClass
{'var1': 1,
'var2': 2}
但是,对于类子类中断,因为很难确定父类的起始位置和结束位置(因为上面的__repr__
没有进一步缩进嵌套层次)。
我会很高兴的东西,如下面,想象cls1
和cls2
有一个int属性var
:
Child
{'cls1': {
'var': 1,
},
'cls2': {
'var': 0,
}
}
可悲的是,我不知道如何做到这一点(或者如果它甚至有可能) 。有什么想法吗?
你想要的东西,像'高清__repr __(自我,缩进= 1)',虽然可能也没有办法,所以你必须推出自己的一个将其与'pformat'结合起来,而且会有一些奇怪的角落你无法覆盖的案例 – 2013-04-22 13:25:52