gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:29:35 25 4
gpt4 key购买 nike

我有一个表示接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com