python - 嵌套类实例的有用默认 __repr__

标签 python class

我有一个表示接口(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__ 没有进一步缩进更多级别的嵌套)。

我会很高兴像下面这样的东西,想象 cls1cls2有一个 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/

相关文章:

python - 如何从每个一级指标中最大的二级指标的单元格中取值?

python - 将字符串查找列表转换为 python 中的列表

python - 被自己弄糊涂了 ["name"] = 文件名

javascript - Js,将静态函数从Class设置为变量对象时 'this'是什么

python - Apache-Spark 如何与类中的方法一起工作

python - 将多个 csv 加载到数据框中的最快方法

python - 无需更改 Python 和 Ruby 代码即可进行日志记录

C++ 结构和类编译器错误

java - isInstance 和 instanceof - 为什么没有通用方法?

class - PowerMockito doReturn null 对象