--- tags: [python, OOP] --- # Class inheritance in Python We distinguish the **parent/source/superclass** class and the **subclass** that **extends** it. A subclass can have more than one parent class that it extends, but this is atypical. > The subclass will inherit all attributes and methods of the superclass unless > it overrides them. In addition to overriding the methods of the parent we can extend them in the child. This is a bit like using an abstract. ## Example of class inheritance ```py class Person: """ Our superclass """ def __init__(self, name, age): self.name = name self.age = age def birthday(self): print('Happy birthday you were', self.age) self.age += 1 print('You are now', self.age) def __str__(self): return self.name + ' is ' + str(self.age) class Employee(Person): """ Our subclass that extends `Person` """ def __init__(self, name, age, id): super().__init__(name, age) self.id = id def calculate_pay(self, hours_worked): rate_of_pay = 7.50 if self.age >= 21: rate_of_pay += 2.50 return hours_worked * rate_of_pay def __str__(self): return super().__str__() + ' - id(' + str(self.id) + ')' ``` ### Key points - We pass the name of the parent class to the child class as a parameter - We must include all of the parent class's attributes in the constructor of the subclass - We must use a special `super().__init__(..,...)` method to enact the extension of the parent. This method references the `__init__` class in the parent. ## Protected/private methods and attributes > Protected methods and attributes are private to the class but can be accessed > from any subclass > Private methods cannot be accessed from anywhere outside of the class We declare private methods and attributes with a double underscore (`__`). We declare protected methods and attributes with a single underscore (`_`). This is **convention**, there are not actually private and protected attributes or properties.