super (). method () против Parent.method () - PullRequest
1 голос
/ 05 мая 2019
class Parent():
    def __init__(self, x):
        self.x = x
        print('init parent')
    def hithere(self):
        print('hey there')
        print(self.x)

class Child(Parent):
    def __init__(self, x):
        self.x = x
        super().hithere()

child = Child(3)

Здесь у меня есть родительский класс и дочерний класс, который наследуется от родительского.Зачем мне нужен super () Если я всегда могу сделать одно и то же, заменив его именем родительского класса, который я встраиваю:

class Parent():
    def __init__(self, x,y):
        self.x = x
        self.y = y
        print('init parent')
    def hithere(self):
        print('hey there')
        print(self.x)

class Child(Parent):
    def __init__(self, x):
        self.x = x
        Parent.hithere(self)

child = Child(3)

, который делает то же самое.

Мой второй вопрос: правильно ли говорить, что абстрактные классы не могут иметь атрибутов?Если Parent был абстрактным классом, то всякий раз, когда один из его методов вызывает self, например hithere (self), мне нужно передать его обратно с помощью super (). Method (self).Таким образом, эти атрибуты на самом деле являются атрибутами Child, которые, как оказалось, имеют те же имена атрибутов, что и используемый родительский класс.

Ответы [ 2 ]

0 голосов
/ 05 мая 2019

Вы почти всегда хотите использовать self.foo(), если только вы не пишете Child.foo метод, который перезаписывает Parent.foo.

Если позже вы напишите метод Child.hithere, ваш текущий код не будет его использовать, что часто не то, что вам нужно.

0 голосов
/ 05 мая 2019

Это одно и то же, но вы должны super(), потому что:

В будущем, если вы захотите изменить имя родительского класса, вам не нужно менятьимя для каждого экземпляра.

Например,

Parent.hithere(self)
Parent.hithere1(self)
Parent.hithere2(self)

Теперь, если вы измените имя вашего родительского класса, вам придется изменить имя Parent для каждого экземпляра.Это было бы не так, если бы вы сделали:

super().hithere1()
super().hithere2()
super().hithere3()

Я думаю, что ваш второй вопрос неоднозначен, но вы можете прочитать больше об абстрактном классе здесь .

...