我有一个表示接口的抽象基类。该类的子类作为属性存储了该类的其他子类。
例如:
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
深度和布局的层次结构事先无法确定,但不会是递归的。
我可以在AbstractBase
上放置什么作为__repr__
,以便以有用的方式查看每个子类的属性?
我的当前方法是:
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
子类的基础类,这会输出可读性较高的内容,例如:
MyClass
{'var1': 1,
'var2': 2}
然而,对于具有AbstractBase子类的类,它会出现问题,因为很难确定父类从哪里开始,另一个类从哪里结束(考虑到__repr__以上未给进一步缩进的更深层次的嵌套)。
如果像下面这样想象cls1和cls2有一个单独的int属性var,我会感到高兴:
Child
{'cls1': {
'var': 1,
},
'cls2': {
'var': 0,
}
}
很遗憾,我不知道如何实现这个(或者它是否可能)。有什么想法吗?
def __repr__(self, indent=1)
这样的东西,虽然可能无法与pformat
结合使用,因此您必须自己编写一个。并且会有一些奇怪的边角情况是不能完全覆盖的。 - Karoly Horvath