다중 상속

이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 사이트와, 다음 두 채널도 오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
●  잔재미코딩 뉴스레터 오픈 [구독해보기]
●  잔재미코딩 유투브 오픈 [구독해보기]

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
아래 코드를 실행시키면서, 위 코드 결과와 비교하며, 출력 값이 왜 이렇게 나왔는지 이해하기(다중 상속)
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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

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

본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
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
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
  • 다양한 상속구조에서 메서드 이름을 찾는 순서는 '__mro__'에 튜플로 정의되어 있음
    • MRO: Method Resolution Order 의 약자
In [195]:
PartTimer.__mro__
Out[195]:
(__main__.PartTimer,
 __main__.Student,
 __main__.Worker,
 __main__.Person,
 object)