Запутаться о супер функции и себя в Python - PullRequest
0 голосов
/ 21 февраля 2020

Вот код, который меня смущает.

#python3 code
class SuperClass():
    def __init__(self,a):
        self.a = a

class SubClass(SuperClass):
    def __init__(self,a):
        self.a = a
        super(SubClass,self).__init__(a+1)


if __name__ == '__main__':
    sub = SubClass(1)
    print(sub.a) # result is 2
    # print(super(SubClass,sub).a) # AttributeError: 'super' object has no attribute 'a'

Я предполагаю, что при вызове super(SubClass,self).__init__(a+1) объект sub передается в self в суперклассе, не является родительским объектом sub .

У меня есть 2 вопроса:

  1. Правильно ли мое предположение? Если правильно, почему дизайн такой? Если нет, то каков правильный механизм?
  2. как я могу передать значение a + 1 в SuperClass.a ,, другими словами, получается super(SubClass,sub).a=2

Спасибо

Редактировать 1

Извините за код. Я потерял две строки self.a=a и super(SubClass,self).__init__(a+1). Я исправил код выше ,, и он все еще поддерживает мое предположение.

Редактировать 2

#Let me explain my doubt in detail
#Generally We have a class Clazz
class Clazz():
    def f(self,a):
        pass
# and it's instance c
c = Clazz();
# when invoke method f of instance c, instance should be  implicit pass to the method as first parameter.
c.f(1) # formally equivalent to c.f(c,1)

#then back to my case
#In my logic
# super(SubClass,self) is a instance of class super ,when it invokes method __init__
# Similarly super(SubClass,self).__init__(a+1) should be equivalent to super(SubClass,self).__init__(super(SubClass,self),a+1)
class SuperClass():
    def __init__(self,a):   #  self=super(SubClass,sub)
        self.a = a          #  formally equivalent to super(SubClass,sub).a = a

# however it's not like as i thought
# super(SubClass,self).__init__(a+1) formally equivalent to super(SubClass,self).__init__(sub,a+1)
class SuperClass():
    def __init__(self,a):   #  self=sub
        self.a = a          #  formally sub.a = a
# it's contradictory

1 Ответ

1 голос
/ 21 февраля 2020

Краткий ответ: невозможно.

Длинный ответ: Ваш SubClass наследуется от SuperClass. Когда вы инициализируете объект sub из SubClass, он входит в __init__ вашего SubClass. Там он говорит, что нужно запустить __init__ вашего SuperClass, где значение sub.a установлено на 2, но сразу после SubClass вы пишете sub.a значение 1.

Значение sub.a перезаписывается. Это прошло. Переменная существует только один раз, а не дважды. В этом случае ваш подкласс и суперкласс ссылаются на одну и ту же переменную sub.a

Если вы хотите сохранить значение, вам нужно определить новую переменную и записать туда свое значение.

#python3 code
class SuperClass():
    def __init__(self,var):
        self.a = var

class SubClass(SuperClass):
    def __init__(self,var):
        super(SubClass,self).__init__(var+1)
        self.b = var

if __name__ == '__main__':
    sub = SubClass(1)
    print(sub.a)
    print(sub.b)
...