[태그:] <span>classmethod</span>

안녕하세요. 언제나 휴일, 언휴예요.

이전 강의에서는 Python에서의 캡슐화 중에서 접근 지정을 통한 정보 은닉에 관하여 다루었어요.

이번 강의에서는 메서드의 종류에 관해 다룰 거예요. Python의 클래스의 메서드에는 멤버 메서드, 클래스 메서드, 정적 메서드가 있어요.

멤버 메서드는 개체마다 독립적으로 수행하는 메서드로 메서드 정의문에서 첫번째 인자로 self 키워드를 명시합니다. 예를 들어 유닛의 “운동하다”와 같은 메서드는 개체마다 독립적으로 수행해야 할 것입니다.

    def Play(self,hour):
        print(hour,"시간 운동하다.")
        self.__SetHP(self.__hp+hour)

클래스의 메서드와 정적 메서드는 개체에 관계없이 동작하는 메서드입니다. 이 둘의 차이점은 클래스 변수를 사용할 수 있는가, 없는가에 차이가 있습니다.

만약 클래스 메서드를 정의하고자 한다면 @classmethod를 명시한 후에 메서드를 정의합니다. 그리고 메서드의 첫번째 입력 인자로 cls를 명시하며 메서드 내에서 클래스 변수에 접근할 때 cls키워드를 이용합니다.

class Unit:
    __last_num=0

    @classmethod
    def GetLastNum(cls):
        return cls.__last_num

    @classmethod
    def __AssignNum(cls):
        cls.__last_num+=1
        return cls.__last_num

정적 메서드를 정의할 때는 @staticmethod를 명시한 후에 메서드를 정의합니다. 클래스 변수를 접근할 수 없다는 점에서 클래스 메서드와 차이점입니다.

    @staticmethod
    def MoreStrong(unit, hp):
        return unit.__hp>hp

    @staticmethod
    def IsEqual(unit, num):
        return unit.__num == num

다음은 메서드 종류를 설명하기 위해 정의한 Unit 클래스와 이를 사용한 코드입니다.

class Unit:
    __last_num=0

    @classmethod
    def GetLastNum(cls):
        return cls.__last_num

    @classmethod
    def __AssignNum(cls):
        cls.__last_num+=1
        return cls.__last_num

    def __init__(self,name):
        self.__num = Unit.__AssignNum()
        self.__name = name
        self.__hp = 100

    def GetNum(self):
        return self.__last_num

    def GetHP(self):
        return self.__hp

    def GetName(self):
        return self.__name

    def __SetHP(self, hp):
        if(hp<0):
            hp = 0
        if(hp>100):
            hp = 100
        self.__hp = hp

    def Play(self,hour):
        print(hour,"시간 운동하다.")
        self.__SetHP(self.__hp+hour)

    def Drink(self, cups):
        print(cups,"잔 마시다.")
        self.__SetHP(self.__hp-cups)

    @staticmethod
    def MoreStrong(unit, hp):
        return unit.__hp>hp

    @staticmethod
    def IsEqual(unit, num):
        return unit.__num == num

members = list()
members.append(Unit("홍길동"))
members.append(Unit("강감찬"))

for unit in members:
    print("유닛 이름:{0} 체력:{1}".format(unit.GetName(), unit.GetHP()))
    if(Unit.IsEqual(unit,2)):
        unit.Play(1)
    else:
        unit.Drink(1)
print("최근 생성한 학생 번호:",Unit.GetLastNum())
[그림 1] 메서드의 종류 예제 실행 화면
[그림 1] 메서드의 종류 예제 실행 화면

미래실험실 pYTHON