io.BufferedIOBase
не должен быть создан , у него даже не должно быть публичного конструктора.Вам, конечно, не нужно здесь, это базовый класс , чтобы документировать методы, которые должны реализовывать буферизованные объекты ввода / вывода, с реализациями по умолчанию, на которых могут основываться наследующие классы.
Из документации io.BufferedIOBase
:
Базовый класс для двоичных потоков, поддерживающих некоторую буферизацию.Наследует IOBase
.Общедоступного конструктора не существует.
Вам нужно только использовать BytesIO
, он наследует от BufferedIOBase
, он сам уже реализует методы, необходимые для буферизованного I/ O объект.Из io.BytesIO
документации :
наследуется BufferedIOBase
.[...]
[...]
BytesIO
предоставляет или переопределяет эти методы в дополнение к методам из BufferedIOBase
и IOBase
: [...]
Оберните ваш BytesIO
объект непосредственно в TextIOWrapper()
объект здесь:
>>> import io
>>> bytes_io = io.BytesIO(b"a\nb\nc")
>>> text_io = io.TextIOWrapper(bytes_io)
>>> for line in text_io:
... print(line, end='')
...
a
b
c
Где документация TextIOWrapper
говорит вам, что первый аргумент должен быть BufferedIOBase
двоичный поток, цель - сообщить вам, что вам нужен подкласс BufferedIOBase
, то, что реализует этого интерфейса.BytesIO
является таким объектом, как и io.BufferedIOReader()
, io.BufferedIOWriter()
, io.BufferedRandom()
и io.BufferedRWPair()
.
Как правило, вы не создадите экземпляры любого из ABC, перечисленных в Иерархия классов в разделе документации.Они предназначены для того, чтобы предоставить документацию, что-то, что нужно проверить, когда вам нужно проверить типы, и быть прочной основой для получения пользовательских реализаций.