В с++ можно перегрузить операторы ввода/вывода(>>/<<), можно ли сделать похожий эффект в питоне?

Я знаю, что в питоне нету таких операторов, есть функции print и input, но есть ли какой то способ сделать такой же эффект, который получается, когда мы в с++ перегружаем эти операторы, если способа нету, то второй вопрос: почему в питоне так сделать нельзя?


Ответы (2 шт):

Автор решения: Qwertiy

Для вывода можно перегрузить приведение к строке через __str__.

А вот для ввода я ничего не придумал.

https://ideone.com/Jma0HC

class Bear:
  def __str__(self):
    return "Я тучка, тучка, тучка,\nЯ вовсе не медведь!"
    
pooh = Bear()
print(pooh)

операторы ввода/вывода(>>/<<)

Во-первых, это операторы битового сдвига, во-вторых, в питоне они есть, но используются только по прямому назначению.

почему в питоне так сделать нельзя?

  1. Потому что перегрузка операторов реализуется другим способом.
  2. Потому что нет строгой типизации, а значит выбрать нужную перегрузку на основе кода программы невозможно.
  3. Потому что в куче языков решили, что перегрузка операторов им вовсе не нужна.
→ Ссылка
Автор решения: Roman Konoval

В принципе перегрузить операции битового сдвига можно, но есть проблема с вводом, т.к. в питоне нет 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)
→ Ссылка