일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- b2b 마케팅
- postgresql
- 데이터 전처리
- EXCEPT
- search ads
- 문자열 함수
- Pickle
- 파이썬 코딩 무료 강의 (기본편) - 6시간 뒤면 여러분도 개발자가 될 수 있어요 [나도코딩]
- sql
- 머신러닝 입문 강좌 | TEAMLAB X Inflearn |
- 퍼포먼스 마케팅
- Def
- 디지털 검색광고
- ndarray
- PYTHON
- google sa
- 양승화
- 오블완
- MAC
- dvdrental
- 숫자형
- 파이썬
- preprocessing
- 티스토리챌린지
- GA4
- 검색광고 캠페인
- 외장함수
- dbeaver
- pgAdmin
- inflearn
- Today
- Total
Maron's DATA Log
[Python] 클래스 / 메소드 (Method) / 상속 본문
# 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 |