본문 바로가기
WIL&TIL/TIL

20230330 TIL class 아직도 모르는 사람

by 코드뭉치 2023. 3. 30.

class의 상속과 디폴트 2

class의 상속과 디폴트값을 넣는 과정에서 디폴트를 지정해주어도 값이 들어오지 않았다는 에러 문구가 나왔다.

 

def __init__(self, name, hp=random.randrange(40, 51), mp=random.randrange(40, 51), power=random.randrange(40, 51), magic_power=random.randrange(40, 51), speed=random.randrange(6, 9), experience=0, level=1, money=0):


def __init__(self, name, power=0, money=1)


crazy_cloud = CrazyCloud(player_name, 1, 1, 1, 1, 1, 1, 1, 1)
 

1. 처음에는 기본값을 random모듈로 줘서 오류가 난 것이라고 생각해서 다 지워버렸다.

2. 아래처럼 인스턴스를 찍어낼 때 값을 줘 봤지만 여전히 인자를 받아오지 못함. 부모클래스에 디폴트 값을 주니 오버라이딩하면서 값을 가져오지 못함...

 

3. 그 후 여러 시도 끝에 상속 받은 자식 클래스에 값을 주니까 정상적으로 작동은 하는 것을 확인했다.

부모에 있는 클래스에다 default를 주는 것이 아니라 상속 받은 클래스에 default 값을 줘야 인자를 받아온다.

> 틀린것은 아님. 그러나 이렇게 할 필요가 없다. 코드가 매우 더러워지고, 상속을 이용하는 의미가 없어진다.

> 각각 디폴트값을 주는 것 말고 한번에 각각 클래스에 디폴트를 줄 수 없을까?  

 

클래스에서 __init__함수는 각각의 인자들을 초기화 하는데,

여기서 __init__에 들어간 값들이 상속하는 과정에서 초기화되어 값을 받아오지 못한 것이다.

 

class BaseCharacter:
    def __init__(self, name):
        self.name = name
        self.max_hp = random.randrange(40, 51)
        self.hp = self.max_hp
        self.power = random.randrange(10, 16)
        self.max_mp = random.randrange(40, 51)
        self.mp = self.max_mp 
        self.magic_power = random.randrange(10, 16)
        self.speed = random.randrange(6, 9)
        self.experience = 0
        self.level = 1
        self.money = 0
        self.items = {}

class Character(BaseCharacter):
    def __init__(self, name):
        super().__init__(name)
        
class CrazyCloud(Character): 
    def __init__(self, name):
        super().__init__(name)
        self.power = 500
        self.hp = 1000
        self.speed = 1

 

기본값을 지정해 줄 때, 부모 클래스의 __init__ 메서드에서 기본값을 설정해 줄 수 있다.

이 경우, 자식 클래스에서는 해당 인자를 받아오지 않아도 된다.

위와 같이 BaseCharacter 클래스에서 기본값을 설정해 주면,

Character 클래스와 CrazyCloud 클래스에서 따로 기본값을 설정할 필요가 없어지며,

필요한 부분만 오버라이딩하여 값을 수정해 주면 된다.!!

 

 

 

댓글