Dziedziczenie cz.1

We wcześniejszym wpisie o programowaniu obiektowym w Pythonie opisałem podstawy dziedziczenia. Klasę bazową (Superclass), z której klasa potomna dziedziczy wszystkie atrybuty i metody zapisujemy w deklaracji klasy pochodnej (Subclass) jako argument tzn.

class Subclass(Superclass):
    pass

Gdy klasa potomna dziedziczy po kilku klasach bazowych, to dziedziczy też atrybuty i metody z tych klas. Gdy jednak w dwóch różnych klasach bazowych są atrybuty lub metody o takich samych nazwach, to klasa potomna dziedziczy ten atrybut lub tę metodę, której klasa była wcześniej na liście argumentów w definicji klasy potomnej tzn.

class Person:
    greeting = 'Hi!'
    def function1(self):
        print('hello')

class Employee:
    greeting = "What's up!"
    def function1(self):
        print('world')
    def function2(self):
        pass

class Manager(Employee, Person):
    pass

if __name__ == '__main__':
    john_doe = Manager()
    print(dir(john_doe)
    print(john_doe.greeting)
    john_doe.function1() 

Jak widać na podstawie powyższego przykładu klasa Manager posiada obie metody: function1() i function2() oraz zmienną greeting. Wartością zmiennej greeting będzie napis What’s up! a wynikiem funkcji będzie wyświetlenie napisu world.

>>część druga<<

Dziedziczenie cz.2

Podczas dziedziczenia metody z klasy bazowej możemy nadpisać kod metody (przesłonić metodę) i wtedy uzyskać całkiem nową funkcjonalność, bądź też powiększyć funkcjonalność metody. Metoda __init__() uzyskała zwiększoną funkcjonalność w klasie pochodnej, natomiast kod metody function1() został przesłonięty w podklasie tzn.

class Person:
    def __init__(self, name):
    	self.name = name
    def function1(self):
    	print('Hello')

class Employee(Person):
    def __init__(self, name, job):
    	super().__init__(name)
    	self.job = job
    def function1(self):
    	print('Hi!')

if __name__ == '__main__':
    john_doe = Employee('John Doe', 'programmer')
    print(john_doe.name)
    print(john_doe.job)
    john_doe.function1()

Funkcja super wywołuje metodę z klasy basowej, w tym przypadku __init__(), dzięki temu metoda w podklasie wykorzystuje kod z klasy bazowej i dodaje nową funkcjonalność.

Zamiast zastosować konstrukcję z funkcją super() można zastosować konstrukcję z nazwą klasy bazowej tj.

Person.__init__(self, name)

Jest to szczególnie przydatne, gdy klasa potomna dziedziczy po kilku klasach bazowych i zależy nam na wykorzystaniu konkretnej metody z określonej klasy bazowej.