#python #oop #inheritance #super
Вопрос:
class base():
def __init__(self):
self.var = 10
def add(self, num):
res = self.var num
return res
class inherit(base):
def __init__(self, num=10):
x = super().add(num)
a = inherit()
print(a)
Привет,
Я изучаю наследование и супер(). При выполнении этого AttributeError: 'inherit' object has no attribute 'var'
возвращается ошибка. Как я могу наследовать переменные инициализации тоже?
Комментарии:
1. Сначала вызовите конструктор
super()
для инициализации экземпляра класса, затем получите доступ к переменной экземпляра.
Ответ №1:
Сначала вам нужно вызвать super
конструктор, потому что вы не определили var
в своем base
конструкторе класса.
Рабочая версия вашего кода (хотя вам, вероятно, следует добавить var в базу __init__
)
class Base:
def __init__(self):
self.var = 10
def add(self, num):
res = self.var num
return res
class Inherit(Base):
def __init__(self, num=10):
super().__init__()
x = super().add(num)
a = Inherit()
print(a)
одно из возможных решений
class Base:
def __init__(self, var=10):
self.var = var
def add(self, num):
res = self.var num
return res
class Inherit(Base):
pass
a = Inherit()
a.add(0) # replace 0 with any integer
Комментарии:
1. Кроме того, если вы работаете с Python 3, база классов должна явно наследовать
object
2. У тебя все наоборот. Если вы используете Python 2, то он должен наследоваться от объекта. В Python 3 это не нужно.
3. Я думаю, что ПЕП говорит, что, хотя это и не обязательно, это хорошая практика, я посмотрю на это.
4. @May.D — Классы Python 2 изначально не наследовались
object
. Это было введено, когда семантика классов изменилась с классов «старого стиля» на классы «нового стиля», и было чем-то вроде грязного взлома. Начиная с python 3, все классы являются классами «нового стиля», и грязный хак не нужен. Это действительно только для обратной совместимости. Это один из тех случаев, когда я не думаю, что явный выигрыш.5. @tomasz — это хорошее замечание. Примером является явное указание аргументов по умолчанию.
open("whatever", "r")
например, тонко заставляет рецензента дважды подумать…