# -*- 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() 내장함수를 사용해 해결 가능
# -*- 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__()