multigoodverse
multigoodverse

Reputation: 8072

How to set value of parent argument to child method?

I have a Paragraph class:

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

I made a subclass out of it:

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()

While Paragraph got the text directly as argument, the subclass generates the text from the get_from_file method.

However, I cannot seem to call the inherited translate method:

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

That throws an error:

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'

One solution is to change the subclass init to:

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

However, that means removing the initialization of super(). Is there another solution without having to remove super().__init__?

Or is this not even the case to make use of inheritance?

Upvotes: 1

Views: 95

Answers (2)

Lavanya V
Lavanya V

Reputation: 357

i think that you should also give a value for the filepath while creating the object here

fp = FileParagraph("sample.txt")

you should also input a value for the filepath along with text eg

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

Upvotes: 0

UnholySheep
UnholySheep

Reputation: 4096

The error comes from calling the get_from_file method, which relies on self.filepath, before self.filepath is set. Simply changing the order of the two lines in __init__ fixes this

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()

Upvotes: 1

Related Questions