java나 python등 프로그래밍 언어를 다룰 때 간단한 코드 정도는 굳이 클래스를 만들지 않고도 동작 가능하지만,
복잡한 코드에서 클래스를 여러 개 만들어 사용할 때 여러 attiribute를 중복해서 사용하는 경우엔 굳이 하나씩 재선언 할 필요도 없고 좀 더 깔끔하게 코드를 작성할 수 있다.
중복하여 속성을 사용하기 위해 상위 클래스의 속성을 가져와서 쓸 수 있는 것을 상속이라고 일컫는다.
class overwatch:
def __init__(self, name, HP):
self.name = name
self.HP = HP
def get_name(self):
print(f'영웅 이름 : {self.name}')
def get_HP(self):
print(f'영웅 HP: {self.HP}')
위 코드는 오버워치 게임의 영웅별 이름, 체력을 입력 후 반환할 수 있다.
오버워치에선 영웅이 탱커, 딜러, 힐러 세 종류의 포지션으로 나눠진다.
앞서 언급했듯이 클래스를 상속하지 않으면 포지션 별 클래스 생성시 계속 변수를 중복해서 코딩해야하는 불편함이 존재한다.
이를 어느정도 해결하기 위해 super()를 사용한다
class healer(overwatch): # 괄호 안에 상속 받을 부모 클래스
def __init__(self, name, damage, HP, heal):
super().__init__( name, damage, HP)
self.heal = heal
class dealer(overwatch):
def __init__(self, name, damage, HP, deal):
super().__init__( name, damage, HP)
self.deal = deal
class tanker(overwatch):
def __init__(self, name, damage, HP, tank): # tank는 방볍 체력
super().__init__( name, damage, HP)
self.tank = tank
__init__() 매직 메소드만 가져와서, 현재 예시 코드에서는 name 과 HP 2개의 변수만 사용하여 직접 입력 하였지만, 실제 코드를 구성할 때는 수많은 변수를 사용할 수 있다.
변수의 개수가 많을 시에는 아래 두 방법으로 여러 변수를 대체할 수 있다.
예를 들어 보자
def game_name(player, *names):
print(player)
for name in names:
print(name)
player = '나'
name1 = '스타크래프트'
name2 = '롤'
name3 = '오버워치'
name4 = '서든어택'
game_name(player, name1,name2, name3, name4)
위 코드를 실행하면 아래와 같이 잘 동작하는 결과를 얻을 수 있다.

하지만, 만약 game_name(*names, player)라고 순서를 바꿔쓰면 어떻게 될까?
def game_name(*names, player,):
print(player)
for name in names:
print(name)
player = '나'
name1 = '스타크래프트'
name2 = '롤'
name3 = '오버워치'
name4 = '서든어택'
game_name(player, name1,name2, name3, name4)
아래와 같이 오류가 발생한다.

파이썬은 어떤 변수에서 부터 어느 변수까지 *로 처리하는 지 알아서 모르기 때문에 묶이지 않는 변수와 선언할 때는 해당 변수 뒤에 선언을 해주어야 동작한다. (즉, 순서에 주의!)
**kwargs는 keyword arguments의 약자로, key, value의 딕셔너리 형태로 함수에 전달된다.
아래 예시를 보자
def name(**kwargs):
for key, value in kwargs.items():
if 'kim' == key:
print(f'김씨가 {value}라고 말했습니다.')
print( )
else:
print(f'{key}씨가 {value}라고 말했습니다.')
name(kim = '안녕하세요')
name(jun = '안녕히가세요')
결과는 아래와 같이 나온다

즉, 방금 언급했듯 함수 안의 값을 딕셔너리의 형태로 받는다
부모 클래스는 상속을 통해 보다 더 효율적으로 사용 가능
__init__()매소드를 상속받기 위해 super().__init__()과 같이 사용 가능
함수 또는 클래스 내 인자 전달 시 *args, **kwargs 방식으로 전달 가능
*args는 튜플 형태, **kwargs는 딕셔너리 형태로 값을 참조할 수 있다.
변수 / *변수 / **변수 입력 순서도 결과에 영향을 주니 주의하여 사용