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
'# Programming Language > Python' 카테고리의 다른 글
[Python] 파이썬 정리(18)_ __name__과 __main__ (0) | 2021.07.31 |
---|---|
[Python] 파이썬 정리(16)_데코레이터 (0) | 2021.07.31 |
[Python] 파이썬 정리(15)_프로퍼티 (0) | 2021.07.31 |
[Python] 파이썬 정리(14)_dict가 주는 메모리 부담 해결하는 __slots__ (0) | 2021.07.31 |
[Python] 파이썬 정리(13)_정보은닉/__dict__ (0) | 2021.07.31 |