Как заметил @jasonharper, вам нужно изменить конструктор так, чтобы он принимал любой файл, подобный объекту.
Тогда вы можете получить что-то вроде следующего:
class Foo:
def __init__(f: TextIO) -> None:
self.initialize(f)
def initialize(self, stream)
pass # Some stuff happens here. Details not important.
@classmethod
def from_text(cls, text: str) -> 'Foo'
stream = io.StringIO(text)
return cls(stream)
@classmethod
def from_filename(cls, filename: str) -> 'Foo'
with open(filename) as f:
return cls(f)
РЕДАКТИРОВАТЬ: Если вы должны сохранить тот же конструктор, вы можете использовать именованный временный файл , например:
@classmethod
def from_text(cls, text: str) -> 'Foo'
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(text)
return cls(f.name)
Примечание: аргумент delete=True
установлен так, что чтение работает внесколько платформ. Обязательно прочитайте документы, чтобы понять различные варианты.