我有一个表示接口(interface)的抽象基类。此类的子类将此类的其他子类存储为属性。
例如:
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
的子类),这会输出一些可读的内容,例如:
MyClass
{'var1': 1,
'var2': 2}
但是,对于带有 AbstractBase
的类它破坏了子类,因为很难分辨父类从哪里开始和另一个结束(假设上面的 __repr__
没有进一步缩进更多级别的嵌套)。
我会很高兴像下面这样的东西,想象 cls1
和 cls2
有一个 int 属性 var
:
Child
{'cls1': {
'var': 1,
},
'cls2': {
'var': 0,
}
}
遗憾的是,我不知道如何实现这一目标(或者是否可能)。有什么想法吗?
最佳答案
我喜欢我这样做的结果:
class AbstractBase(object):
def __repr__(self, indent=2):
result = self.__class__.__name__ + '\n'
for k,v in self.__dict__.iteritems():
if k.startswith('__'):
continue
if isinstance(v, AbstractBase):
vStr = v.__repr__(indent + 2)
else:
vStr = str(v)
result += ' '*indent + k + ': ' + vStr
result += '\n'
return result
关于python - 嵌套类实例的有用默认 __repr__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147243/