Как работает метод строк __add__ в python?
Всем доброго времени суток. Недавно при определении пользовательского метода join строк столкнулся с интересной особенностью.
class MyStr(str):
def join(self, obj):
print('method join')
s = MyStr()
answer = s.join([1, 2, 3, 4, 5, [6, 7, [8, 9, [0]]]])
# output: method join
Здесь код работает как и ожидалось. Однако, если мы попробуем прибавить к строке другую строку, а затем вызвать метод join(), то будет вызвано исключение TypeError:
class MyStr(str):
def join(self, obj):
print('method join')
s = MyStr()
s += 'hello'
answer = s.join([1, 2, 3, 4, 5, [6, 7, [8, 9, [0]]]])
В чем разница?
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
потому что s - это не строка, а ваш класс MyStr
когда без определения операции сложения (__add__) вы пытаетесь сложить его со строкой, то получаете на выходе строку
s = MyStr()
s += 'hello'
print(type(s)) # выведется <class 'str'>
а у строки метод join() работает с другими данными, а не теми, которые вы передаёте
Например можно сделать так, чтобы работало:
class MyStr(str):
def join(self, obj):
print('method join')
def __add__(self, str):
return MyStr(str)
s = MyStr()
s += 'hello'
answer = s.join([1, 2, 3, 4, 5, [6, 7, [8, 9, [0]]]])