python의 class 상속
상속 받은 클래스를 기반으로 새로운 클래스 만들기
class Monster():
hp = 100
alive = True
def damage(self, attack): # self는 내가 받은 attack은 내가 받은 데미지
self.hp = self.hp - attack
if self.hp < 0:
self.alive = False
def status_check(self): # 죽었는지 살았는지
if self.alive( == True):
print('살아있다')
else:
print('죽었다')
m1 = Monster()
m1.damage(150)
m1.status_check() # 죽었다.
m2 = Monster()
m2.damage(90)
m2.status_check() # 살았다.
# 자체적으로 관리가 가능
# m1, m2는 인스턴스
## 상속을 사용하지 않는 경우
class FireMonster():
def __init__(self, hp):
self.hp = hp
def attack(self, damage):
self.hp -= damage
def status_check(self):
print(f"monster's hp : {self.hp}")
class IceMonster():
def __init__(self, hp):
self.hp = hp
def attack(self, damage):
self.hp -= damage
def status_check(self):
print(f"monster's hp : {self.hp}")
class WindMonster():
def __init__(self, hp):
self.hp = hp
def attack(self, damage):
self.hp -= damage
def status_check(self):
print(f"monster's hp : {self.hp}")
# attack이나 status_check 함수들이 중복으로 들어가게 된다.
# 코드 관리가 어렵고 보기도 어렵다.
## 상속을 사용할 경우
class Monster(): # 고정. 건들지 않음.
def __init__(self, hp):
self.hp = hp
def attack(self, damage):
self.hp -= damage
def status_check(self):
print(f"monster's hp : {self.hp}")
class FireMonster(Monster): # class Monster을 상속받음. (class Monster : parents or super class / class FireMonster : child or sub class)
def __init__(self, hp):
self.attribute = "fire"
super().__init__(hp) # super()를 사용하면 부모 클래스의 코드(__init__함수 : self.hp = hp코드)를 그대로 사용할 수 있다.
# 부모 클래스에 존재하는 코드 중 변경하고 싶은 부분이 있으면 메소드(함수)를 overriding 한다.
def status_check(self):
print(f"fire monster's hp : {self.hp}")
class IceMonster(Monster):
def __init__(self, hp):
self.attribute = "ice"
super().__init__(hp)
def status_check(self):
print(f"ice monster's hp : {self.hp}")
fire_monster = FireMonster(hp=100) # FireMonster 클래스에는 attack 메소드가 없지만
# 부모 클래스에서 상속받았기 때문에 별도의 선언 없이 사용 가능하다.
fire_monster.attack(20)
fire_monster.status_check()
ice_monster = IceMonster(hp=200)
ice_monster.attack(50)
ice_monster.status_check()
# fire monster's hp : 80
# icd monster's hp : 150
## 다른 사람이 만든 모듈의 계산기 코드를 사용하고 있다고 가정
class Calc:
def _print_zero_division_error(self):
print("can't be division by zero")
def plus(self, num1, num2):
...
def minus(self, num1, num2):
...
def divide(self, num1, num2):
if num2 == 0:
self._print_zero_division_error()
return False
...
def multiply(self, num1, num2):
...
calc = Calc()
calc.divide(5, 0)
# can't be division by zero
# 이 멘트를 한글로 출력하고 싶다고 해서 모듈의 코드는 건드리지 않는 것이 좋다.
# 이때 상속을 활용하면 모듈 내 코드를 변경하지 않고 코드를 수정할 수 있다.
class CustomCalc(Calc): # Calc라는 부코 클래스를 상속 받음
def _print_zero_division_error(self):
print("0으로는 나눌 수 없습니다.") # 코드 변경을 원하는 부분에 overriding 한다.
calc = CustomCalc() #
calc.divide(5, 0)
# 0으로는 나눌 수 없습니다.