패스트캠퍼스 한 번에 끝내는 파이썬 웹 개발 초격차 패키지 pt2 여러가지 메서드

정영찬·2022년 2월 2일
0

메서드 종류

  • 인스턴스 메서드
  • 클래스 메서드
  • 정적 메서드
  • 매직 메서드

인스턴스 메서드(instance method)

-인스턴스 속성에 접근할 수 있는 메서드
-항상 첫번째 파라미터로 self를 갖는다.

※ hit 메서드 구현하기
데미지를 받으면 체력과 방어막이 깎이는 hit 메서드를 구현한다.

① 데미지가 방어막보다 작거나 같으면 방어막만 깎인다.
② 데미지가 방어막보다 크고 체력보다 작으면 체력과 방어막이 깎인다.
③ 데미지가 체력보다 크면 체력을 0으로 만든다.

class Unit:
    """
    인스턴스 속성 : 이름, 체력, 방어막, 공격력
    -> 객체마다 다른 값을 가지는 속성
    """

    count = 0
    def __init__(self, name, hp, shield, demage):
        self.name = name
        self.hp = hp
        self.shield = shield
        self.demage = demage
        Unit.count += 1
        print(f"[{self.name}](이)가 생성 되었습니다.")
    
   
    def __str__(self):
        return f"[{self.name}] 체력 : {self.hp} 방어막 : {self.shield} 공격력 : {self.demage}"

    # 인스턴스 메서드 (내가 만든 메서드) 
    def Hit(self, Unit):
        if self.demage <= Unit.shield: #공격자의 데미지가 상대 유닛의 쉴드보다 작다면
            Unit.shield = Unit.shield - self.demage
            print(f" {Unit.name} 남은 쉴드: {Unit.shield} 남은 체력 :{Unit.hp}")
        elif self.demage > Unit.shield: #공격자의 데미지가 상내 유닛의 쉴드보다 크다면
            remainDemage= self.demage - Unit.shield
            if remainDemage < Unit.hp: # 남은 데미지가 체력보다 작으면 
                Unit.hp = Unit.hp - remainDemage
                print(f" {Unit.name} 남은 체력 :{Unit.hp}")
            else: # 남은 데미지가 체력보다 크다면
                Unit.hp = 0
                print(f" {Unit.name} 남은 체력 :{Unit.hp} 파괴되었습니다.")
    
    #(강의에서 만든 메서드)
    def hit(self,demage):
        #방어막 변경
        if self.shield >= demage:
            self.shield -= demage
            demage = 0
        else:
            demage -= self.shield
            self.shield = 0
        #체력 변경
        if demage > 0:
            if self.hp > demage:
                self.hp -= demage
            else:
                self.hp=0

    

           

probe = Unit("프로브", 20, 20, 5)
zealot = Unit("질럿", 100, 60, 16)
dragoon = Unit("드라군", 100, 80, 20)


zealot.Hit(probe)
zealot.Hit(probe)
zealot.Hit(probe)

dragoon.hit(20)
print(dragoon)

# 결과
프로브 남은 쉴드: 4 남은 체력 :20
프로브 남은 체력 :8
프로브 남은 체력 :0 파괴되었습니다.
[드라군] 체력 : 100 방어막 : 60 공격력 : 20

내가 만든 메서드는 공격자와 피격자를 적으면 유닛마다 정의된 인스턴스 속성을 활용해서 공격자의 데미지만큼 감소된 피격자의 쉴드와 체력을 보여주는 반면, 강의에서 보여준 메서드는 피격대상과 데미지의 수치를 적으면 피격대상의 체력과 쉴드를 그 데미지만큼 감소하여 리턴을 하는 메서드이다.

클래스 메서드

-클래스 속성에 접근하기 위해서 사용하낟.
-클래스를 의미하는 cls를 파라미터로 받는다.

	class Unit:
    count = 0
    ...
    @classmethod
    def print_count(cls):
    print(f"전체유닛 개수: {cls.count}")

정적 메서드

-인스턴스를 만들 필요가 없는 메서드
-self를 받지 않는다.
-메서드가 인스턴스 유무와 관계 없이 독립접으로 사용 될때

	class Math:
    # 정적 메서드(static method)
    # 인스턴스를 만들 필요가 없는 메서드
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def sub(x,y):
        return x - y
    
print(Math.add(5,6))
print(Math.sub(10,2))

매직 메서드

-클래스안에 정의할 수 있는 스페셜 메서드
-특별한 상황에 호출된다. ex) init

__이름__ 의 형태로 되어있다.

※dir 함수: 객체가 가지고 있는 메서드와 속성을 확인할수 있는 메서드 ex) dir(probe)

profile
개발자 꿈나무

0개의 댓글