Наследование переменных из нескольких функций класса с помощью функции super()

#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") например, тонко заставляет рецензента дважды подумать…