Meervoudige overerving

Gevorderde objectgeoriënteerde programmering in Python

Jake Roach

Data Engineer

Meervoudige overerving

Laat een klasse de functionaliteit van meer dan één klasse overerven

  • Intern kan erven van zowel Employee als Student
  • Behoudt een is-een-relatie

Een Intern-klasse die erft van een Employee- en Student-klasse.

class Employee:
  def __init__(self, department):
    self.department = department

  def begin_job(self):
    print(f"Welcome to {self.department}!")
class Student:
  def __init__(self, school):
    self.school = school
    self.courses = []

  def add_course(self, course_name):
    self.courses.append(course_name)
Gevorderde objectgeoriënteerde programmering in Python

Meervoudige overerving

class Intern(Employee, Student):
    def __init__(self, department, school, duration):
        # Roep BEIDE constructors aan
        Employee.__init__(self, department)
        Student.__init__(self, school)
        self.duration = duration

    def onboard(self, mentor):
        # Implementatie van een nieuwe methode
        ...
Gevorderde objectgeoriënteerde programmering in Python

Een Intern-object maken

stephen = Intern("Software Development", "Echo University", 10)
stephen.begin_job()  # Methode van Employee
Welcome to Software Development!
stephen.add_course("Intermediate OOP in Python")  # Methode van Intern
print(stephen.courses)
["Intermediate OOP in Python"]
Gevorderde objectgeoriënteerde programmering in Python

Meerlagige overerving

Erf een klasse die weer van een andere klasse erft; je wordt kleinkind

  • Behoud een is-een-relatie

Grafiek die meerlagige overerving toont.

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

  def introduce(self):
      print(f"Hello, my name is {self.name}")
class Employee(Person):
  def __init__(self, name, title):
    Person.__init__(self, name)
    self.title = title

  def change_position(self, new_title):
    print(f"Starting new role as {new_title}")
    self.title = new_title
Gevorderde objectgeoriënteerde programmering in Python

Meerlagige overerving

class Manager(Employee):
  def __init__(self, name, title, number_reports):
    Employee.__init__(self, name, title)
    self.number_reports = number_reports

mike = Manager("Mike", "Engineering Manager", 14)
mike.introduce()
mike.change_position("Director of Engineering")
print(mike.number_reports)
Hallo, ik heet Mike
Nieuwe functie: Director of Engineering
14
Gevorderde objectgeoriënteerde programmering in Python

Method resolution order (MRO)

De volgorde waarin Python bepaalt welke methode wordt gebruikt wanneer ouder en kind een methode met dezelfde naam hebben

Volg deze regels voor de MRO:

  • Eerst zoeken in kinderen
  • Ouders worden links-naar-rechts doorzocht zoals gedefinieerd in de class-definitie

$$

.mro()-methode en __mro__

Kindklasse erft meerdere ouderklassen.

1 Beyond the Basic Stuff with Python, Sweigart (p. 311)
Gevorderde objectgeoriënteerde programmering in Python

Method resolution order (MRO)

class Intern(Employee, Student):  # Intern erft van Employee en Student
  ...

# Vind de MRO voor Intern
print(Intern.mro())
[<class '__main__.Intern'>, <class '__main__.Employee'>, <class '__main__.Student'>, <class 'object'>]
# Vind de MRO met __mro__
print(Intern.__mro__)
(<class '__main__.Intern'>, <class '__main__.Employee'>, <class '__main__.Student'>, <class 'object'>)
Gevorderde objectgeoriënteerde programmering in Python

Laten we oefenen!

Gevorderde objectgeoriënteerde programmering in Python

Preparing Video For Download...