В с++ можно перегрузить операторы ввода/вывода(>>/<<), можно ли сделать похожий эффект в питоне?
Я знаю, что в питоне нету таких операторов, есть функции print и input, но есть ли какой то способ сделать такой же эффект, который получается, когда мы в с++ перегружаем эти операторы, если способа нету, то второй вопрос: почему в питоне так сделать нельзя?
Ответы (2 шт):
Для вывода можно перегрузить приведение к строке через __str__.
А вот для ввода я ничего не придумал.
class Bear:
def __str__(self):
return "Я тучка, тучка, тучка,\nЯ вовсе не медведь!"
pooh = Bear()
print(pooh)
операторы ввода/вывода(>>/<<)
Во-первых, это операторы битового сдвига, во-вторых, в питоне они есть, но используются только по прямому назначению.
почему в питоне так сделать нельзя?
- Потому что перегрузка операторов реализуется другим способом.
- Потому что нет строгой типизации, а значит выбрать нужную перегрузку на основе кода программы невозможно.
- Потому что в куче языков решили, что перегрузка операторов им вовсе не нужна.
В принципе перегрузить операции битового сдвига можно, но есть проблема с вводом, т.к. в питоне нет lvalue в принципе (т.е. нельзя передать в функцию грубо говоря адрес переменной, чтобы этой переменной можно было присвоить значение из функции), поэтому нужно использовать какой-то контейнер для значения:
class LValue:
def __init__(self, value=None):
self.value = value
class IO:
def __lshift__(self, value):
print(value)
def __rshift__(self, value):
value.value = input()
io = IO()
io << 'hello'
a = LValue()
io >> a
print(a.value)