Как решить проблему с методом super() в Python?

Почему возникает ошибка?

class Tree():
    def __init__(self, name):
        self.height = 0
        self.age = 0
        self.name = name

    def info(self):
        print(f'Name: {self.name}\nHeight: {self.height}\nAge: {self.age}\n')

    def grow(self):
        self.age += 1
        self.height = 2 ** self.age


tree = Tree('oak')

tree.info()

tree.grow()
tree.info()

class FruitTree(Tree):
    def __init__(self):
        super().__init__(age)

    def get_fruit(self):
        print(f'Apples: {self.Tree.age/2}')

fruit = FruitTree()

fruit.get_fruit()

Ошибка в 24 строке:

super().__init__(age)

NameError: name 'age' is not defined

В чем проблема?


Ответы (2 шт):

Автор решения: S. Nick

Не уверен что правильно понял вас, но предложу попробовать так:

class Tree():
    def __init__(self, name=''):                                                     # +++ name=''
        super().__init__()    
        self.height = 0
        self.age = 0
        self.name = name

    def info(self):
        print(f'Tree() - Name: {self.name}; Height: {self.height}; Age: {self.age}')

    def grow(self):
        self.age += 1
        self.height = 2 ** self.age
        print(f'Tree() - Name: {self.name}; Height: {self.height}; Age: {self.age}') # +++


class FruitTree(Tree):
    def __init__(self):
#        super().__init__(age)
        super().__init__()                                                           # +++
        
        print(f'\nFruitTree(Tree): self.age = {self.age}; tree.age = {tree.age}')    # +++ 

    def get_fruit(self):
#        print(f'Apples: {self.Tree.age/2}')
        print(f'Apples: {tree.age / 2}\n')                                           # +++ tree.age
        

tree = Tree('oak')
tree.info()
tree.grow()
tree.info()        

fruit = FruitTree()
fruit.get_fruit()

tree.grow()                   # +++
tree.grow()                   # +++
fruit.get_fruit()             # +++

введите сюда описание изображения

→ Ссылка
Автор решения: Multiplexer

super().__init__(age) это, можно сказать, аналог записи Tree.__init__(age). age которая передается в дочернем классе FruitTree это необъявленная переменная в данном классе. age - переменная в классе FruitTree и self.age в классе Tree, это разные переменные. Интерпретатор выдает ошибку.

Также у вас логическая ошибка возникает:

class Tree():
    def __init__(self, name):
        self.height = 0
        self.age = 0
        self.name = name

Конструктор класса Тree принимает один параметр - name Который потом присваивается переменной self.name = name , соответственно передавая например age вот так:

class FruitTree(Tree):
    def __init__(self):
        age = 12
        super().__init__(age)

В родительском классе будет происходить следующее:

 class Tree():
     def __init__(self, name):
         self.height = 0
         self.age = 0
         # переменная name = 12
         self.name = name
         # self.name = 12
→ Ссылка