Наследование и __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 шт):
Это необязательно. Но может быть полезно, когда родительский init содержит много нужной Вам логики (соблюдается DRY). – nomnoms12 9 минут назад
Благодарю пользователя @nomnoms12 за ответ
В примерах разная логика.
В первом примере я бы пивал 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()