我已经阅读了答案here,并且每个人似乎都同意将str
映射到列表应该在该列表的每个元素上调用element.__str__
,但是{{1}正在被调用。我已经完成了代码,并且正在正确生成列表。
My Collection包装器如下所示:
__repr__
从class Wrapper:
def __init__(self, *args):
self.foo = list(args)
def __str__(self):
return ", ".join(map(str, self.foo))
开始,它会跳转到包含的类中的Wrapper.__str__()
。该课程如下:
__repr__
当我使用调试器逐步执行代码时,执行会直接从class MyType:
def __init__(self, arg1, arg2, arg3):
self.arg1 = arg1
# set the other values
def __repr__(self):
return "I am a repr"
def __str__(self):
return "I am a str"
中的地图行跳转到Wrapper
中的__repr__
。如果我致电MyType
,我会跳转到str(wrapper_instance.foo[0])
。为什么会这样?
编辑:Wrapper是被调用的实际类型的超类,尽管子类没有实现__str__
。子类定义如下所示:
__str__
为了遵守非主题规则并回答有关如何调用代码的一些问题,我正在进行的具体调用是:
class SubWrapper(Wrapper):
def __init__(self, definite_arg, *args):
super().__init__(args)
self.definite_arg = definite_arg
def __repr__(self):
return "I am a subclass repr"
EDIT_2:事实证明问题出在班级的构建中 - >>> w = Wrapper(MyType(1, 2, 3), MyType(4, 5, 6))
>>> s = SubWrapper(MyType(7, 8, 9), MyType(1, 2, 3), MyType(4, 5, 6))
>>> print(str(w))
I am a str, I am a str
>>> print(str(s))
(I am a repr, I am a repr)
>>> print(", ".join(map(str, w.foo)))
I am a str, I am a str
>>> print(", ".join(map(str, s.foo)))
(I am a repr, I am a repr)
应该致电SubWrapper.__init__
答案 0 :(得分:0)
如果您打印内置容器,它将使用每个项目 1 的表示形式:
>>> [MyType(), MyType()]
[I am a repr, I am a repr]
>>> print([MyType(), MyType()])
[I am a repr, I am a repr]
>>> Wrapper(MyType(), MyType()).foo
[I am a repr, I am a repr]
但是,如果你map
每个元素到一个字符串,那么它(显然)将使用字符串表示:
>>> ','.join(map(str, [MyType(), MyType()]))
'I am a str,I am a str'
>>> print(Wrapper(MyType(), MyType()))
I am a str, I am a str
因此,无论您在容器上使用list
还是__repr__
,内置容器(如str
)内的项目都会显示repr
。您明确需要转换每个项目,以便使用其__str__
方法显示它。
1 我从__init__
删除了MyType
方法。这只会使代码片段“缩短”并减少卷积。