python

[python] Class, __init__, 상속

독립성이 강한 ISFP 2023. 2. 15. 22:28
728x90
반응형

# 함수를 사용하지 않은경우 

메이플스토리로 예시를 들어보자면

D_name = "듀얼블레이드"
D_HP = 1000
D_MP = 200

print("{0} 캐릭터가 생성되었습니다.".format(D_name))
print("체력 {0}, 공격력 {1}".format(D_HP,D_MP))

듀얼블레이드 캐릭터가 생성되었습니다.

체력 1000, 공격력 200

 

A_name = "아델"
A_HP = 900
A_MP = 150

print("{0} 캐릭터가 생성되었습니다.".format(A_name))
print("체력 {0}, 공격력 {1}".format(A_HP,A_MP))

아델 캐릭터가 생성되었습니다.

체력 900, 공격력 150

 

# 함수를 사용한 경우

위와 같은 코드를 함수를 이용해서 간략하게 작성을 해보면

def  attack(name, location, damage):
    print("{0} : {1} 지역에서 사냥을 합니다. [MP {2}]".format(name,location,damage))
    
attack(D_name,"엘나스",D_MP)
attack(A_name,"커닝시티",A_MP)

듀얼블레이드 : 엘나스 지역에서 사냥을 합니다. [MP 200]

아델 : 커닝시티 지역에서 사냥을 합니다. [MP 150]

 

그런데 만약 캐릭터가 하나가 아닌 수백개라면?

캐릭터의 name, HP, MP 를 계속해서 추가해줘야 한다.

이러한 불편함을 막기 위해 클래스 라는 것을 사용한다.

 

# 클래스

class maple:
    def __init__(self, name, HP, MP):
        self.name = name
        self.HP = hp
        self.MP = damage

        print("{} 캐릭터가 생성 되었습니다.".format(name))
        print("HP {}, MP {}".format(HP, MP))
        
D = maple('듀열블레이드', 1000, 200)
A = maple('아델', 900, 150)
AA = maple('아델',800,130)

듀열블레이드 캐릭터가 생성 되었습니다. HP 1000, MP 200

아델 캐릭터가 생성 되었습니다. HP 900, MP 150

아델 캐릭터가 생성 되었습니다. HP 800, MP 130

 

# __init__ (생성자)

객체(D, A, AA)가 만들어질 때 자동으로 호출됨

class maple:
    def __init__(self, name, HP, MP):
        self.name = name
        self.HP = HP
        self.MP = MP
        
A = maple('듀얼블레이드',1000,200)
print(A.name, A.HP)

듀얼블레이드 1000

 

# 메소드

class mapleAttack:
    def __init__(self, name, HP, MP):
        self.name = name
        self.HP = HP
        self.MP = MP

    def attack(self, location):
        print("{0} : {1} 지역에서 사냥을 합니다. [MP {2}]".format(self.name,location, self.MP))

    def damaged(self, damaged):
        print("{0} : {1} 데미지를 입었습니다.".format(self.name,100))

        self.HP -= damaged
        print("{0} : 현재 HP는 {1} 입니다.".format(self.name, self.HP))

        if self.HP <= 0 :
            print("{0} : 파괴되었습니다.".format(self.name))

D = mapleAttack('듀열블레이드', 1000, 200)
D.attack("커닝시티")

D.damaged(25)
D.damaged(25)

듀열블레이드 : 커닝시티 지역에서 사냥을 합니다. [MP 200]

듀열블레이드 : 100 데미지를 입었습니다.

듀열블레이드 : 현재 HP는 975 입니다.

듀열블레이드 : 100 데미지를 입었습니다.

듀열블레이드 : 현재 HP는 950 입니다.

 

# 상속

 
# 일반 유닛
class Unit:
    def __init__(self, name, hp,damage):
        self.name = name
        self.hp = hp

# 공격 유닛
class AttackUnit:
    def __init__(self, name, hp, damage):
        self.name = name
        self.hp = hp
        self.damage = damage

    def attack(self, location):
        print("{0} : {1} 방향으로 적군을 공격. [공격력 {2}]".format(self.name,location, self.damage))

    def damaged(self, damaged):
        print("{0} : {1} 데미지를 입었습니다.".format(self.name,damaged))
        self.hp -= damaged
        print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
        if self.hp <= 0 :
            print("{0} : 파괴되었습니다.".format(self.name))

firebat1 = AttackUnit("파이어뱃",50,16)
firebat1.attack("5시")

firebat1.damaged(25)
firebat1.damaged(25)

위 코드에서 

- self.name = name
- self.hp = hp
이 두가지가 일반 유닛과 공격 유닛에 중복되는 코드임
-> Unit 이라는 클래스를 상속받아서 AttackUnit을 만들어보자!
 
# 일반 유닛
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, damaged):
        print("{0} : {1} 데미지를 입었습니다.".format(self.name,damaged))
        self.hp -= damaged
        print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))
        if self.hp <= 0 :
            print("{0} : 파괴되었습니다.".format(self.name))

firebat1 = AttackUnit("파이어뱃",50,16)
firebat1.attack("5시")

firebat1.damaged(25)
firebat1.damaged(25)

 

# 상속 쉬운 예시

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def get_name(self):
        print(f'제 이름은 {self.name}입니다.')
    
    def get_age(self):
        print(f'제 나이는 {self.age}세 입니다.')
        
class Student(Person):
    def __init__(self, name, age, GPA):
        super().__init__(name, age)
        self.GPA = GPA

    def get_GPA(self):
        print(f'제 학점은 {self.GPA}입니다.')
        
        
student_a = Student('김OO', 27, 3.4)
student_a.get_name() # 제 이름은 김OO입니다.
student_a.get_age() # 제 나이는 27세 입니다.
student_a.get_GPA() # 제 학점은 3.4입니다.
728x90
반응형