[Python] TIL 05
__init__
파이썬에서 쓰이는 생성자이다. 객체가 만들어질때 단독으로 호출되는 부분이다. 객체는 클래스로부터 만들어지는 것을 말한다. 아래 코드를 예시를 들어보자.
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)
marine1 = Unit("탱크", 150, 15)
-마린과 탱크를 '객체'라고 표현한다.
-마린과 탱크는 Unit 클래스의 인스턴스라고 표현한다.
-객체가 생성될때는 기본적으로 __init__
함수에 정의된 갯수와 동일하게 해야한다.
ex) def init(self, name, hp, damage): 일때 marine1 = Unit("마린", 40, 5)
처럼 self를 제외한 갯수로 동일하게 해준다.
🎂멤버 변수
-클래스 내에서 정의된 변수고, 그 변수를 가지고 초기화할수도 있고 실제로 쓸수도 있는거임ㅇㅇ
-클래스 외부에서도 사용 가능
-멤버변수 초기화 : self.a = a
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))
wraith1 = Unit("레이스", 80, 5)
print("유닛 이름: {0}, 공격력: {1}".format(wraith1.name, wraith1.damage))
-클래스 내에 있는 멤버 변수 말고도 외부에서 새로 변수를 할당하여 쓸 수 있다. 확장된 변수는 내가 확장한 객체에 대해서만 적용이 된다. (기존에 있던 다른 객체는 적용이 안된다)
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))
wraith2.clocking = True
if wraith2.clocking == True:
print("{0}는 현재 클로킹 상태입니다".format(wraith2.name))
🎂메소드
-클래스 안에 구현된 함수는 다른 말로 메소드라고 부른다.
-클래스 메소드 앞에는 무조건 self를 써준다.
-파이썬 메소드의 첫 번째 매개변수 이름은 관례적으로 self를 사용한다. 객체를 호출할 때 호출한 객체 자신이 전달되기 때문에 self를 사용한 것이다. 물론 self말고 다른 이름을 사용해도 상관없다.
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, 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 클래스 이름(상속할 클래스 이름)
위 코드를 보면 클래스 내에 중복되는 부분이 있다.
self.name = name
self.hp = hp
해당 부분은 아래와 같이 상속 받게끔 써준다. AttackUnit
은 Unit
을 상속받게 되고 name과 hp를 받으면서 초기화할 수 있고 추가로 damage를 정의할 수 있다.
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
AttackUnit 클래스는 Unit 클래스를 상속했으므로 Unit 클래스의 모든 기능을 사용할 수 있어야 한다.
🎂다중 상속
-부모가 둘 이상이라 여러곳에서 상속을 받음
-상속을 받는 입장이 자식 클래스이고, 상속을 주는 입장이 부모 클래스다.
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))
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))
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)
valkyrie = FlyableAttackUnit("발키리", 200, 6, 5)
valkyrie.fly(valkyrie.name, "3시")
🎂메소드 오버라이딩
-부모 클래스에서 정의한 메소드 말고 자식 클래스에서 정의한 메소드를 쓰고 싶을때 메소드를 새롭게 정의해서 사용할 수 있음
Author And Source
이 문제에 관하여([Python] TIL 05), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jiiyoung/Python-TIL-05저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)