Maron's DATA Log

[Python] 클래스 / 메소드 (Method) / 상속 본문

Python

[Python] 클래스 / 메소드 (Method) / 상속

maron2ee 2020. 12. 1. 15:25

# Method (메소드)

# 특수 메소드 (Special Method)

: 클래스 안에 정의, 클래스를 파이썬의 built-in-type 과 같은 작동을 하게 해줌

코드 안에 있는 변수, 함수 클래스 등을 모두 객체로써 핸들링, 특수 구문에 의해 호출되는 특정 연산을 구현

 

# __메소드__ : 메소드를 오버로딩 해서 사용

파이썬 내부(built-in)에 존재하는 함수면 메소드 오버로딩을 통해 함수 기능을 내가 원하는 객체에 부여할 수 있음

 

# 클래스에서 속성 (attribute) 만들기

 

# __init__ : 초기화 (initialize) 메소드로 정의된 생성자 (constructor) 함수 호출, 메소드 안에서 self.속성에 값을 할당

파이썬 메소드명으로 __init__ 을 사용하면 이 메소드는 생성자가 됨

클래스명을 쓰고 옆에 바로 인자들을 채워 넣음으로써 그 값들을 지닌 객체를 만들어냄

생성자 함수 내부에서는 생성자를 호출할 때 넣은 입력변수 (인자의 값) 를 속성값으로 저장

 

class FourCal:

   def __init__(self, first, second):

     self.first = first

     self.second = second

   def setdata(self, first, second):

     self.first = first

     self.second = second

   def add(self):

     result = self.first + self.second

     return result

 

* 생성자 (constructor) : 객체가 생성될 때 자동으로 호출되는 메소드

 

a = Fourcal( ) : 생성자의 매개변수인 first와 second에 해당하는 값이 전달되지 않았기 때문에 오류 발생 

a = FourCal(4, 2)

 


 

# 클래스1 - 일반 유닛

 

class Unit:

   def __init__(self, name, hp, damage):     

     self.name = name

     self.hp = hp

     self.damage = damage

     print("{0} 유닛이 생성 되었습니다.".format(self.name))

     print("체력 {0}, 공격력 {1}".format(self.hp, self.damage))

 

marine1 = Unit("마린", 40, 5)     # 객체 : 클래스로부터 만들어지는 것들 // marine & tank - Unit 클래스의 인스턴스

marine2= Unit("마린", 40, 5)

tank1 = Unit("탱크", 150, 25)

# marine3 = Unit("마린", 40, 5)     #  self 제외하고, init 함수에 정의된 갯수와 동일한 값 안 주면 -> error

 

 

# 멤버변수 

: 클래스 내에서 정의된 변수, 초기화 및 사용 가능 // 클래스 외부에서 작성해 변수 확장 가능

 

# 레이스 : 공중 유닛, 비행기. 클로킹 (상대방에게 보이지 않음)

wraith1 = Unit("레이스", 80, 5)

print("유닛 이름 : {0}, 공격력 : {1}".format(wraith1.name, wraith1.damage))     # . 으로 멤버변수에 접근 

 

# 마인드 컨트롤 : 상대방 유닛을 내 것으로 만드는 것 (빼앗음)

wraith2 = Unit("빼앗은 레이스", 80, 5)

wraith2.clocking = True

 

if wraith2.clocking ==True:

   print("{0} 는 현재 클로킹 상태입니다. ".format(wraith2.name))

 

# if wraith1.clocking ==True:

   # print("{0} 는 현재 클로킹 상태입니다. ".format(wraith2.name))     # error - 확장된 변수는 확장한 객체에 대해서만 적용, 기존에 있던 객체에는 적용 안됨

 

 

# 메소드

# 클래스2 - 공격 유닛

class AttackUnit:

   def __init__(self, name, hp, damage):     

     self.name = name     # 메소드 앞에는 항상 self 적어줘야

     self.hp = hp

     self.damage = damage

 

   def attack(self, location):     

     print("{0} : {1} 방향으로 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))     # self 붙어있으면 - 클래스 자기 자신 안에 있는 멤버 변수 값 출력, self 없이 쓰면 - 전달 받은 값 사용

 

   def damaged(self, damage):     

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

     self.hp -= damage

     print("{0} : 현재 체력은 {1} 입니다.".format(self.name, self.hp))

     if self.hp <= 0:

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

 

# 메딕 : 의무병

# 파이어뱃 : 공격 유닛, 화염방사기

firebat1 = AttackUnit("파이어뱃", 50, 16)

firebat1.attack("5시")

 

# 공격 2번 받는닫고 가정

firebat1.damaged(25)

firebat1.damaged(25)

 


# 상속

:  상속을 사용해 이미 만들어진 클래스 코드를 재사용하여 다른 클래스를 생성

 

상속의 대상 - 부모 클래스 (parent class)

상속을 받는 클래스 - 자식 클래스 (child class)

 

class 자식클래스이름(부모클래스이름):

   def __init__(self, 속성값1, 속성값2):

     super(자식클래스이름, self).__init__( )     # 부모 클래스의 초기화 생성자를 호출

     자식 클래스의 초기화 코드

 

# 일반 유닛

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)

     self.damage = damage

  

   def attack(self, location):     

     print("{0} : {1} 방향으로 적군을 공격합니다. [공격력 {2}]".format(self.name, location, self.damage))     # self 붙어있으면 - 클래스 자기 자신 안에 있는 멤버 변수 값 출력, self 없이 쓰면 - 전달 받은 값 사용

 

   def damaged(self, damage):     

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

     self.hp -= damage

     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 Flyable:

   def __init__(self, flying_speed):

     self.flying_speed = flying_speed

 

   def fly(self, name, location):

     print("{0} : {1} 방향으로 날아갑니다. [속도 {2}]".format(name, location, self.flying_speed))

 

# 공중 공격 유닛 클래스

class FlyableAttackUnit(AttackUnit, Flyable):

   def __init__(self, name, hp, damage, flying_speed):

     AttackUnit.__init__(self, name, hp, damage)

     Flyable.__init__(self, flying_speed)

 

# 발키리 : 공중 공격 유닛, 한번에 14번 미사일 발사

valkyrie = FlyableAttackUnit("발키리", 200, 6, 5)

valkyrie.fly(valkyrie.name, "3시")

 

# 메소드 오버라이딩 (Method Overriding)

: 여러 클래스에 걸쳐서 같은 이름의 메소드를 만듦

부모 클래스에서 정의한 매소드 말고, 자식 클래스에서 정의한 매소드 쓰고 싶을 때, 매소드를 새롭게 정의해서 사용

 

# 일반 유닛

class Unit:

   def __init__(self, name, hp, speed):     

     self.name = name

     self.hp = hp

     self.speed = speed

 

   def move(self, location):

     print("[지상 유닛 이동]")

     print("{0} : {1} 방향으로 이동합니다. [속도 {2}]".format(self.name, location, self.speed)) 

 

# 공격 유닛

class AttackUnit(Unit):     # 공격유닛이 일반유닛 클래스를 상속 받아서 만들어짐

   def __init__(self, name, hp, speed, damage):

     Unit.__init__(self, name, hp, speed)

     self.damage = damage

 

...

 

# 공중 공격 유닛 클래스

class FlyableAttackUnit(AttackUnit, Flyable):

   def __init__(self, name, hp, damage, flying_speed):

     AttackUnit.__init__(self, name, hp, 0, damage)     # 지상 speed = 0

     Flyable.__init__(self, flying_speed)

 

   def move(self, location):     # 메소드 오버라이딩

     print("[공중 유닛 이동]")

     self.fly(self.name, location)  

 

# 벌쳐 : 지상 유닛, 기동성이 좋음

vulture = AttackUnit("벌쳐", 80, 10, 20)

 

# 배틀크루저 : 공중 유닛, 체력 굉장히 좋고, 공격력도 좋음

battlecruiser = FlyableAttackUnit("배틀크루저", 500, 25, 3)

 

vulture.move("11시")

# battlecruiser.fly(battlecruiser.name, "9시")

battlecruiser.move("9시")

 

# Pass

# 건물

class BuildingUnit(Unit):

   def __init__(self, name, hp, location):

     pass     # (__init__ 함수 완성 안하고) 일단 넘어감

 

# 서플라이 디폿 : 건물, 1개 건물 = 8 유닛

supply_depot = BuildingUnit("서플라이 디폿", 500, "7시")

 

 

def game_start( ):

   print("[알림] 새로운 게임을 시작합니다.")

 

def game_over( ):

   pass

 

game_start( )

game_over( )

 

 

# Super

# 건물

class BuildingUnit(Unit):

   def __init__(self, name, hp, location):

     # Unit.__init__(self, name, hp, 0)

     super( ).__init__(name, hp, 0)     # super 를 통해서 초기화를 할때에는 ( ) 붙이고, self 정보는 안 보내줌

     self.location = location


class Unit:

   def __init__(self):

     print("Unit 생성자")

 

class Flyable:

   def __init__(self):

     print("Flyable 생성자")

 

class FlyableUnit(Unit, Flyable):     # 다중생성자 - 맨 처음 상속 받는 걸로만 출력, 뒤에껀 호출 안됨

   def __init__(self):

     super( ).__init__( )

 

class FlyableUnit(Unit, Flyable):     

   def __init__(self):

     Unit.__init__(self)

     Flyable.__init__(self)     # 두번 통해서 초기화 -Unit 생성자, Flyable 생성자 둘 다 호출

 

# 드랍쉽

dropship = FlyableUnit( )

 

 

'Python' 카테고리의 다른 글

[Python] 모듈, 패키지, 내장함수, 외장함수  (0) 2020.12.01
[Python] 예외처리 - Try / Except / Finally  (0) 2020.12.01
[Python] 입출력  (0) 2020.11.30
[Python] 함수  (0) 2020.11.30
[Python] 조건문 - If / 반복문 - For & While  (0) 2020.11.30
Comments