파이썬과 객체지향 프로그래밍 - . 다중 상속

10. 다중 상속

  • 다중 상속: 2개 이상의 클래스를 상속받는 경우
  • 상속 받은 모든 클래스의 attribute 와 method 를 모두 사용 가능
In [238]:
# 클래스 선언
class Person:
    def sleep(self):
        print('sleep')

class Student(Person):
    def study(self):
        print('Study hard')

class Worker(Person):
    def work(self):
        print('Work hard')

# 다중 상속
class PartTimer(Student, Worker):
    def find_job(self):
        print('Find a job')
In [240]:
parttimer1 = PartTimer()
parttimer1.sleep()
parttimer1.study()
parttimer1.work()
parttimer1.find_job()
sleep
Study hard
Work hard
Find a job
  • 다중 상속된 클래스의 나열 순서가 자식 클래스가 속성(멤버변수,메서드) 호출에 영향을 줌
    • 상속된 클래스 중 앞에 나열된 클래스부터 속성을 찾음
In [241]:
# 클래스 선언
class Person:
    def sleep(self):
        print('sleep')

class Student(Person):
    def study(self):
        print('Study hard')

    def play(self):
        print('play with friends')
        
class Worker(Person):
    def work(self):
        print('Work hard')

    def play(self):
        print('drinks alone')
        
# 다중 상속
class PartTimer(Student, Worker):
    def find_job(self):
        print('Find a job')
초간단 연습12
아래 코드를 실행시키면서, 위 코드 결과와 비교하며, 출력 값이 왜 이렇게 나왔는지 이해하기(다중 상속)


In [243]:
parttimer1 = PartTimer()
parttimer1.study()
parttimer1.work()
parttimer1.play() 
Study hard
Work hard
play with friends
초간단 연습13
Saladent(공부하는 직장인) 클래스 만들기 해당 객체는 Worker와 Student 클래스를 상속받고, play() 메서드 호출시 'drinks alone' 이 출력되도록 할 것
In [244]:
class Saladent(Worker, Student):
    pass
In [245]:
saladent1 = Saladent()
saladent1.play()
drinks alone

다음 코드는 최상위 클래스 메서드를 두 번 호출하게 되는 문제점이 있음 (심화)

In [190]:
# 클래스 선언
class Person:
    def __init__(self):
        print('I am a person')

class Student(Person):
    def __init__(self):
        Person.__init__(self)
        print('I am a student')
        
class Worker(Person):
    def __init__(self):
        Person.__init__(self)
        print('I am a worker')
        
# 다중 상속
class PartTimer(Student, Worker):
    def __init__(self):
        Student.__init__(self)
        Worker.__init__(self)
        print('I am a part-timer and student')
In [191]:
parttimer1 = PartTimer()
I am a person
I am a student
I am a person
I am a worker
I am a part-timer and student


  • super() 내장함수를 사용하면 위의 문제를 해결할 수 있음
In [187]:
# 클래스 선언
class Person:
    def __init__(self):
        print('I am a person')

class Student(Person):
    def __init__(self):
        super().__init__()
        print('I am a student')
        
class Worker(Person):
    def __init__(self):
        super().__init__()
        print('I am a worker')
        
# 다중 상속
class PartTimer(Student, Worker):
    def __init__(self):
        super().__init__()
        print('I am a part-timer and student')
In [188]:
parttimer1 = PartTimer()
I am a person
I am a worker
I am a student
I am a part-timer and student
  • 다양한 상속구조에서 메서드 이름을 찾는 순서는 '__mro__'에 튜플로 정의되어 있음
    • MRO: Method Resolution Order 의 약자
In [195]:
PartTimer.__mro__
Out[195]:
(__main__.PartTimer,
 __main__.Student,
 __main__.Worker,
 __main__.Person,
 object)