Как решить проблему с методом 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 шт):
Не уверен что правильно понял вас, но предложу попробовать так:
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() # +++
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
