클래스에서 상속이란, 물려주는 클래스(Parent Class, Super class)의 내용(속성과 메소드)을 물려받는 클래스(Child class, sub class)가 가지게 되는 것입니다.
자식클래스를 선언할때 소괄호로 부모클래스를 포함시킵니다.
class 부모클래스:
...내용...
class 자식클래스(부모클래스):
...내용...
or
python
class 부모클래스1:
...내용...
class 부모클래스2:
...내용...
class 자식클래스(부모클래스1, 부모클래스2):
...내용...
# 부모 클래스
class Unit:
def __init__(self, name, hp):
self.name = name
self.hp = hp
# 자식 클래스
#공격 유닛
class AttackUnit(Unit): # 소괄호에 부모클래스 포함시킴
def __init__(self, name, hp, damage):
Unit.__init__(self, name, hp) # 부모 클래스에 있는 name과 hp를 불러옴
self.damage = damage
def attack(self, location):
print("{0} : {1} 방향으로 적군을 공격 합니다 [공격력은 {2}]".format(self.name, location, self.damage))
def damaged(self, damage):
print("{0} : {1} 데미지를 입었습니다.".format(self.name, damage))
self.hp -= damage
print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
if self.hp <= 0:
print("{0} : 파괴되었습니다.".format(self.name))
#드랍쉽
class Flyable:
def __init__(self, flying_speed):
self.flying_speed = flying_speed #멤버 변수로 초기화
def fly(self, name, location):
print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))
# 공중 공격 유닛 클래스
# 공격유닛과 드랍쉽을 상속받아서 사용
# 다중상속
class FlyableAttackUnit(AttackUnit, Flyable): # 다중 상속
def __init__(self, name, hp, damage, flying_speed):
AttackUnit.__init__(self, name, hp, damage)
Flyable.__init__(self, flying_speed)
#발키리 : 공중 공격 유닛, 한번에 14발 미사일 발사.
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5)
valkyrie.fly(valkyrie.name, "3시"
메소드 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의 하는 것입니다.
class Unit:
def __init__(self, name, hp, speed):
self.name = name
self.hp = hp
self.speed = speed
# 유닛 이동을 move 정의
def move(self, location):
print("[지상 유닛 이동]")
print("{0} : {1} 방향으로 이동합니다.".format(self.name, location, self.speed))
class AttackUnit(Unit):
def __init__(self, name, hp, speed, damage):
Unit.__init__(self, name, hp, speed)
self.damage = damage
def attack(self, location):
print("{0} : {1} 방향으로 적군을 공격 합니다 [공격력은 {2}]".format(self.name, location, self.damage))
def damaged(self, damage):
print("{0} : {1} 데미지를 입었습니다.".format(self.name, damage))
self.hp -= damage
print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
if self.hp <= 0:
print("{0} : 파괴되었습니다.".format(self.name))
class Flyable:
def __init__(self, flying_speed):
self.flying_speed = flying_speed #멤버 변수로 초기화
def fly(self, name, location):
print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))
# 공중 공격 유닛 클래스 생성
class FlyableAttackUnit(AttackUnit, Flyable):
def __init__(self, name, hp, damage, flying_speed):
AttackUnit.__init__(self, name, hp, 0, damage) #지상 스피드는 0
Flyable.__init__(self, flying_speed)
# move를 재정의
def move(self, location):
print("[공중 유닛 이동]")
self.fly(self.name, location)
자식 클래스에서 부모클래스의 내용을 사용하고 싶을경우 사용
다중 상속일때는 사용이 불가 단일 상속만 사용 가능
# 위에 코드 마지막에 붙으면 작동
# 건물 짓는 유닛 클래스
class BuildingUnit(Unit):
def __init__(self, name, hp, location):
#Unit.__init__(self, name, hp, 0) # 기존 방식을 통한 상속
super().__init__(name, hp, 0) # super 이용
self.location = location