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 클래스에서 따로 기본값을 설정할 필요가 없어지며,
필요한 부분만 오버라이딩하여 값을 수정해 주면 된다.!!
'WIL&TIL > TIL' 카테고리의 다른 글
20230401 TIL (0) | 2023.04.01 |
---|---|
20230331 TIL 알고리즘과 아이컨택하기 (2) | 2023.03.31 |
20230329 TIL 또 나만 모르는 VSCODE 단축키, 프로그래머스 문제풀이 (0) | 2023.03.29 |
20230328 TIL 3일째 class 다시 공부하는 사람 (0) | 2023.03.28 |
20230327 TIL (0) | 2023.03.27 |
댓글