[Python] TIL 05

jiyoung·2021년 11월 30일
0

__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

해당 부분은 아래와 같이 상속 받게끔 써준다. AttackUnitUnit을 상속받게 되고 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시")

🎂메소드 오버라이딩
-부모 클래스에서 정의한 메소드 말고 자식 클래스에서 정의한 메소드를 쓰고 싶을때 메소드를 새롭게 정의해서 사용할 수 있음

0개의 댓글