Programare orientată pe obiecte intermediară în Python
Jake Roach
Data Engineer
Permite unei clase să moștenească funcționalitatea din mai multe clase
Intern poate moșteni atât din Employee, cât și din Student 
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)
class Intern(Employee, Student):
def __init__(self, department, school, duration):
# Make a call to BOTH constructors
Employee.__init__(self, department)
Student.__init__(self, school)
self.duration = duration
def onboard(self, mentor):
# Implementation of a new method
...
stephen = Intern("Software Development", "Echo University", 10)
stephen.begin_job() # Method from Employee
Welcome to Software Development!
stephen.add_course("Intermediate OOP in Python") # Method from Intern
print(stephen.courses)
["Intermediate OOP in Python"]
Moștenirea unei clase care moștenește la rândul ei altă clasă, devenind un „nepot"

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
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)
Hello, my name is Mike
Starting new role as Director of Engineering
14
Ordinea în care Python determină ce metodă este utilizată când părintele și copiii implementează o metodă cu același nume
Reguli pentru determinarea MRO:
class$$
Metoda .mro() și __mro__

class Intern(Employee, Student): # Intern inherits the Employee and the Student classes
...
# Find the MRO for Intern
print(Intern.mro())
[<class '__main__.Intern'>, <class '__main__.Employee'>, <class '__main__.Student'>, <class 'object'>]
# Find the MRO using __mro__
print(Intern.__mro__)
(<class '__main__.Intern'>, <class '__main__.Employee'>, <class '__main__.Student'>, <class 'object'>)
Programare orientată pe obiecte intermediară în Python