Как сделать экземпляр внутри метода класса создания пользовательского объекта - PullRequest
0 голосов
/ 29 октября 2019

У меня есть класс

class Foo:
    def __init__(filename: str) -> None:
        with open(filename) as f:
            self.initialize(f)

    def initialize(self, stream)
        pass  # Some stuff happens here. Details not important.

Я хотел бы добавить метод класса, который принимает строку, то есть текст, который будет в файле, открытом с помощью __init__.

    @classmethod
    def from_text(cls, text: str) -> 'Foo'
        stream = io.StringIO(text)
        cls.initialize(stream)  # This line doesn't quite make sense

Я не уверен, как справиться с тем фактом, что нам нужно вызвать initialize внутри from_text, но у нас еще нет экземпляра. Должен быть какой-то способ, которым я могу создать экземпляр Foo, который я могу передать initialize, но я не знаю, как это сделать. Как это сделать?

1 Ответ

0 голосов
/ 30 октября 2019

Как заметил @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 установлен так, что чтение работает внесколько платформ. Обязательно прочитайте документы, чтобы понять различные варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...