본문 바로가기

컴퓨터/Python

다중상속

# -*- coding: cp949 -*-

class Tiger:

def Jump(self):

print("호랑이처럼 멀리 점프하기")

class Lion:

def Bite(self):

print("사자처럼 한입에 꿀꺽하기")

class Liger(Tiger, Lion):

def Play(self):

print("라이거만의 사육사와 재미잇게 놀기 ")

l = Liger()

l.Bite()

l.Jump()

l.Play()


사자처럼 한입에 꿀꺽하기

호랑이처럼 멀리 점프하기

라이거만의 사육사와 재미잇게 놀기 



다중 상속 시 메서드의 이름 검색 방법

# -*- coding: cp949 -*-

class Tiger:

def Jump(self):

print("호랑이처럼 멀리 점프하기")

def Cry(self):

print("호랑이: 어흥~")

class Lion:

def Bite(self):

print("사자처럼 한입에 꿀꺽하기")

def Cry(self):

print("사자: 으르렁~")

class Liger(Tiger, Lion):

def Play(self):

print("라이거만의 사육사와 재미잇게 놀기 ")

l = Liger()

l.Cry()

호랑이: 어흥~


Liger 선언부에서 상속 받는 순서가 Tiger 클래스부터여서 Tiger 클래스의 이름공간에서 Cry를 찾음


다양한 상속 구조에서 메서드의 이름을 찾는 순서는 __mro__에 튜플로 정의돼 있음

이 예제에서 Liger, Tiger, Lion, object 순서로 검색

object 클래스는 파이썬 3 이후 모든 클래스에서 암묵적으로 상속




super()를 이용한 상위 클래스의 메서드 호출

Animal 클래스의 생성자가 두 번 호출되는 예제

# -*- coding: cp949 -*-

class Animal:

def __init__(self):

print("Animal __init__()")

class Tiger(Animal):

def __init__(self):

Animal.__init__(self)

print("Tiger __init__()")

class Lion(Animal):

def __init__(self):

Animal.__init__(self)

print("Lion __init__()")

class Liger(Tiger, Lion):

def __init__(self):

Tiger.__init__(self)

Lion.__init__(self)

print("Liger __init__()")

l = Liger()

Animal __init__()    << Tiger 클래스에 의해서 호출된 Animal 생성자

Tiger __init__()    

Animal __init__()    << Lion 클래스에 의해서 호출된 Animal 생성자

Lion __init__()

Liger __init__()


Animal 클래스의 생성자가 두 번 호출된다

다이아몬드 형태로 상속되는 경우 문제 발생

super() 내장함수를 사용해 해결 가능

Liger 클래스의 부모 클래스인 Tiger와 Lion 클래스가 모두 Animal 클래스의 자식인 것을 파이썬 인터프리터가 파악해 Animal 클래스의 생성자가 2번 호출되는 것을 피함

# -*- coding: cp949 -*-

class Animal:

def __init__(self):

print("Animal __init__()")

class Tiger(Animal):

def __init__(self):

super().__init__()

print("Tiger __init__()")

class Lion(Animal):

def __init__(self):

super().__init__()

print("Lion __init__()")

class Liger(Tiger, Lion):

def __init__(self):

super().__init__()

print("Liger __init__()")

l = Liger()

Animal __init__()

Lion __init__()

Tiger __init__()

Liger __init__()


'컴퓨터 > Python' 카테고리의 다른 글

모듈 임포트  (0) 2013.07.22
모듈 만들기  (0) 2013.07.22
상속  (0) 2013.07.18
연산자 중복 정의  (0) 2013.07.17
정적메서드, 클래스메서드  (0) 2013.07.17