Я читаю питона кулинарной 2nd, одного образца в "глава 2,13 Использование C++ - как iostream Синтаксис«, я пытаюсь понять, как самостоятельно работы в в коде.перегрузки питон оператор «<<», как C++ iostream
class IOManipulator(object):
def __init__(self, function=None):
self.function = function
def do(self, output):
self.function(output)
def do_endl(stream):
stream.output.write('\n')
stream.output.flush()
endl = IOManipulator(do_endl)
# my understanding, all above is about make a newline and flush sys.stdout,
class OStream(object):
def __init__(self, output=None):
if output is None:
import sys
output = sys.stdout
self.output = output
self.format = '%s'
def __lshift__(self, thing):
if isinstance(thing, IOManipulator):
thing.do(self)
# It make no sense to me, why the function belongs to
# another class's instance need call (self)
else:
self.output.write(self.format % thing)
self.format = '%s' # <- is it necessary? seems to be not.
return self # <- why return a "self" here?
# If comment this line out,
# python raise a TypeError when execute to the "<< 1"
# TypeError: unsupported operand type(s) for <<: 'NoneType' and 'int'
def example_main():
cout = OStream()
cout << "The average of " << 1 << " and " << 3 << " is " << (1+3)/2 << endl
if __name__ == '__main__':
example_main()
# emits:
#> The average of 1 and 3 is 2
«я» является <__main__.OStream object at 0x7fc28cd92410>
, я знаю, что это экземпляр класса OStream, может быть, может быть принято в качестве указателя C.
'return self' требуется, потому что вы используете' << 'на выходе первой операции' '' '' '' и так далее ... –
Обратите внимание, что если функция пропускает 'return', python делает' return None'. Следовательно, ошибка, которую вы видите ('<<' возвращает 'None' и' None << x', не определена). – Bakuriu
В любом случае 'return self' ** не требуется ** строго. Вы должны положить 'return something', но это' something' может быть чем-то другим, как новый 'OStream'. – Bakuriu