За документы (мой акцент):
Тип объекта файла, возвращаемого функцией open (), зависит от режима.Когда open () используется для открытия файла в текстовом режиме ('w', 'r', 'wt', 'rt' и т. Д.), Он возвращает подкласс io.TextIOBase (, в частности, io.TextIOWrapper ).При использовании для открытия файла в двоичном режиме с буферизацией возвращаемый класс является подклассом io.BufferedIOBase.
Действительно, f = open("myfile.txt", "r", encoding="utf-8")
возвращает TextIOWrapper
:
In [18]: f = open("data", "r", encoding="utf-8")
In [19]: type(f)
Out[19]: _io.TextIOWrapper
In [20]: type(f).mro()
Out[20]: [_io.TextIOWrapper, _io._TextIOBase, _io._IOBase, object]