Как установить значение родительского аргумента для дочернего метода? - PullRequest
1 голос
/ 18 апреля 2020

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

from googletrans import Translator

class Paragraph:

    def __init__(self, text, origin_lang='en'):
        self.text = text
        self.origin_lang = origin_lang

    def translate(self, dest_lang='ne'):
        translator = Translator()
        translation = translator.translate(text = self.text,
                                           dest=dest_lang)
        return translation.text

Я сделал из него подкласс:

class FileParagraph(Paragraph):

    def __init__(self, filepath):
        super().__init__(text=self.get_from_file())
        self.filepath = filepath

    def get_from_file(self):
        with open(self.filepath) as file:
            return file.read()

В то время как Paragraph получил text непосредственно в качестве аргумента, подкласс генерирует text из метода get_from_file.

Однако я не могу вызвать унаследованный метод translate:

fp = FileParagraph("sample.txt")
print(fp.translate(dest_lang='de'))

Это приводит к ошибке:

Traceback (most recent call last):
  File "C:/main.py", line 66, in <module>
    fp = FileParagraph("sample.txt")
  File "C:/main.py", line 20, in __init__
    super().__init__(text=self.get_from_file())
  File "C:/main.py", line 25, in get_from_file
    with open(self.filepath) as file:
AttributeError: 'FileParagraph' object has no attribute 'filepath'

Одним из решений является изменение подкласса. init to:

def __init__(self, filepath):
    self.filepath = filepath
    self.text = self.get_from_file()

Однако это означает удаление инициализации super (). Есть ли другое решение без удаления super().__init__?

Или это даже не тот случай использования наследства?

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Ошибка возникает из-за вызова метода get_from_file, основанного на self.filepath, до установки self.filepath. Простое изменение порядка двух строк в __init__ исправляет это

class FileParagraph(Paragraph):

    def __init__(self, filepath):
        # set member variable first
        self.filepath = filepath
        # then call super's init
        super().__init__(text=self.get_from_file())

    def get_from_file(self):
        with open(self.filepath) as file:
            return file.read()
0 голосов
/ 18 апреля 2020

я думаю, что вы должны также указать значение для пути к файлу при создании объекта здесь

fp = FileParagraph("sample.txt")

вы должны также ввести значение для пути к файлу вместе с текстом, например

fp = FileParagraph(text = "sample.txt", filepath = "  ")
...