Наследование и __init__ в Python3

недавно начал изучать Python3, дошел до ООП и заметил странность, автор курса говорит, что нужно обязательно указывать в методе init, вызов метода init класса предка:

class Car:
    def __init__(self, name):
        self.name = name
    def drive(self):
        print(self.name + ' is driving')

class Truck(Car):
    def __init__(self, name):
        Car.__init__(self,name)

man_truck = Truck('Man')
man_truck.drive()

Но в следующей лекции уже не вызывает метод init класса предка:

class Animal:
    def __init__(self, name):
        self.name = name


class Dog(Animal):
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(self.name + ' is saying woof')


class Cat(Animal):
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(self.name + ' is saying meow')


spike = Dog('Spike')
tom = Cat('Tom')

spike.speak()
tom.speak()

Но при этом все работает и особой разницы нету. Хотелось бы узнать почему так происходит и на что это влияет? (P.S. Заранее благодарю за внимание и ответ :3)


Ответы (2 шт):

Автор решения: p4nd0r4qq

Это необязательно. Но может быть полезно, когда родительский init содержит много нужной Вам логики (соблюдается DRY). – nomnoms12 9 минут назад

Благодарю пользователя @nomnoms12 за ответ

→ Ссылка
Автор решения: S. Nick

В примерах разная логика.

В первом примере я бы пивал super(Truck, self).__init__(name)

Во втором примере объект self.name класса Animal вообще не используется. И наследуясь от Animal все равно что от object

Попробуйте и обратите внимание на принты, который я вставил.

class Car:
    def __init__(self, name):
        print(f'!!! {name}')             # <<<-----<
        self.name = name
        
    def drive(self):
        print(self.name + ' is driving')

class Truck(Car):
    def __init__(self, name):
        super(Truck, self).__init__(name)

man_truck = Truck('Man')
man_truck.drive()

print('---------------\n')


class Animal:
    def __init__(self, name):
        print(f'??? {name}')             # <<<-----<
        self.name = name


class Dog(object):                       # Animal
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(self.name + ' is saying woof')


class Cat(Animal):
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(self.name + ' is saying meow')


spike = Dog('Spike')
tom = Cat('Tom')

spike.speak()
tom.speak()
→ Ссылка