728x90


1. static 메소드

* 객체에 속하지 않고 클래스에 속하는 메소드로, 객체 없이 '클래스이름.메소드()' 로 호출 가능
* 객체를 만들 필요가 없기 떄문에 첫번째 인자로 self 를 전달 받지 않는다.
* static 메소드를 만드는 방법은 'staticmethhod()' 를 사용하는 방법과 '@staticmethod' 를 사용하는 방법이 있다.

# staticmethod() 로 클래스 메소드를 만드는 방법

class Simple:
    def sm():
        print("staticmethod")
    sm = staticmethod(sm)


def main():
    # 클래스 이름을 통한 호출
    Simple.sm()
    # 객체를 통한 호출. 클
    s = Simple()
    s.sm()  # 클래스 Simple에 있는 sm 에 접근만 가능한 것이지 객체 s에 메소드가 있는 것은 아님 !

    
main()

 

# @staticmethod 로 클래스 메소드를 만드는 방법

class Simple:
    @staticmethod
    def sm():
        print("staticmethod")


def main():
    # 클래스 이름을 통한 호출
    Simple.sm()
    # 객체를 통한 호출
    s = Simple()
    s.sm()  # 클래스 Simple에 있는 sm 에 접근만 가능한 것이지 객체 s에 메소드가 있는 것은 아님 !


main()

 


2. class 메소드

* static 메소드와 상당히 유사하다.
* class 메소드를 만들려면 @classmethod를 사용하면 된다.
* 첫번째 인자로 cls 을 전달받는다. 매개변수 cls 에 전달되는 것은 클래스메소드가 있는 클래스다.
* class 메소드에는 클래스 정보(cls)이 전달되므로 새로운 객체를 생성하고 반환하는 메소드(팩토리메소드)를 만드는 데 사용된다.

class Ability:
    def __init__(self, pw, mp, dex):  # 캐릭터의 어빌리티는 pw mp dex 로 구성돼 있음
        self.pw = pw
        self.mp = mp
        self.dex = dex

    @classmethod  # 해당 포인트올리는 것을 클래스 메소드로 구현
    def pw_point(cls, character):
        return cls(character.pw + 1, character.mp, character.dex)

    @classmethod
    def mp_point(cls, character):
        return cls(character.pw, character.mp + 1, character.dex)

    @classmethod
    def dex_point(cls, character):
        return cls(character.pw, character.mp, character.dex + 1)

    def show_status(self):
        print('pw : {} / mp : {} / dex : {}'.format(self.pw, self.mp, self.dex))


class Warrior(Ability):  # 워리어 클래스는 어빌리티 클래스를 상속받기 때문에 상위 클래스의 init 으로 초기화 가능
    def show_status(self):
        print('[Warrior] pw : {} / mp : {} / dex : {}'.format(self.pw, self.mp, self.dex))


class Magician(Ability):
    def show_status(self):
        print('[Magician] pw : {} / mp : {} / dex : {}'.format(self.pw, self.mp, self.dex))


def main():
    warrior = Warrior(5, 5, 5)  # 스텟이 5 5 5 인 전사 캐릭터
    warrior.show_status()  # [Warrior] pw : 5 / mp : 5 / dex : 5
    level_up_warrior = Ability.pw_point(warrior)
    level_up_warrior.show_status()  # pw : 6 / mp : 5 / dex : 5

    magician = Magician(1, 9, 5)  # 스텟이 1 9 5 인 마법사 캐릭터
    magician.show_status()  # [Magician] pw : 1 / mp : 9 / dex : 5
    level_up_magician = Ability.mp_point(magician)
    level_up_magician.show_status()  # pw : 1 / mp : 10 / dex : 5


main()

 

 


 

 

728x90

+ Recent posts