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
答案 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
个对象的唯一方式,即A
是str
的子类。
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))
但要注意在不保证的情况下使用继承。