如何在对象列表中使用str.join()

时间:2017-10-10 14:32:15

标签: python

class A:
    def __init__(self, text):
        self.text = text

    def __repr__(self):
        return self.text

    def __str__(self):
        return self.text

    def __add__(self, other):
        return str(self) + other

    def __radd__(self, other):
        return other + str(self)

我希望A个对象的列表是"可加入"与str.join()。 我应该实现哪个special method来实现这一目标?

当然,我可以首先提取一个文本列表然后加入它,但它不是我想要的。

b = A('Hello')
c = A('World')
l = [b, c]

print b, c
print l
print b + ' ' + c
print ' '.join(l) # <- Error here

Hello World
[Hello, World]
Hello World
Traceback (most recent call last):
  File "sandbox.py", line 24, in <module>
    print ' '.join(l)
TypeError: sequence item 0: expected string, instance found

1 个答案:

答案 0 :(得分:11)

__str__仅在对象的用户希望将其变为字符串时使用,而str.join不会。在str使用它们之前,您必须明确地将对象转换为str.join值。

可以 str.join已被定义为隐式调用它作为参数接收的iterable中每个元素的str吗?当然。但它不是。 )

Python的一个原则是&#34;明确比隐含&#34;更好。如果您希望str.join加入对象的字符串表示形式,str个对象传递给join

print(' '.join(str(x) for x in l))

join隐式将str对象视为{em> str个对象的唯一方式,即Astr的子类。

class A(str):
    def __new__(cls, text):
        obj = super().__new__(cls, text)
        # Do whatever else you need to add to obj
        return obj

l = [A('hello'), A('world')]
print(' '.join(l))

但要注意在不保证的情况下使用继承。