Python : 상속

Jinsung·2021년 10월 19일
0

python

목록 보기
18/25
post-thumbnail
post-custom-banner

상속

클래스에서 상속이란, 물려주는 클래스(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시"

오버라이딩(overriding)

메소드 오버라이딩은 부모 클래스의 메소드를 자식 클래스에서 재정의 하는 것입니다.

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)

Super

자식 클래스에서 부모클래스의 내용을 사용하고 싶을경우 사용

다중 상속일때는 사용이 불가 단일 상속만 사용 가능

# 위에 코드 마지막에 붙으면 작동
# 건물 짓는 유닛 클래스
class BuildingUnit(Unit):
    def __init__(self, name, hp, location):
        #Unit.__init__(self, name, hp, 0) # 기존 방식을 통한 상속
        super().__init__(name, hp, 0) # super 이용
        self.location = location
post-custom-banner

0개의 댓글