嵌套类实例的有用默认__repr__

sap*_*api 5 python class

我有一个表示接口的抽象基类.此类的子类存储为此类的其他子类的属性.

例如:

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
Run Code Online (Sandbox Code Playgroud)

层次结构的深度和布局不能提前知道,但不会递归.

我能提出的__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})
Run Code Online (Sandbox Code Playgroud)

对于基类(没有属性是子类AbstractBase,这会输出一些可读的内容,例如:

MyClass
{'var1': 1,
 'var2': 2}
Run Code Online (Sandbox Code Playgroud)

但是,对于具有AbstractBase子类的类,它会中断,因为很难判断父类的起始位置和另一个结束的位置(假设__repr__上面没有给出进一步缩进的更多嵌套级别).

我会对下面的内容感到满意,想象cls1cls2拥有一个int属性var:

Child
{'cls1': {
          'var': 1,
         },
 'cls2': {
          'var': 0,
         }
}
Run Code Online (Sandbox Code Playgroud)

可悲的是,我不知道如何实现这一点(或者甚至可能实现).有什么想法吗?

Joh*_*nck 4

我喜欢我这样做的结果:

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
Run Code Online (Sandbox Code Playgroud)