정적 메소드 : 인스턴스 객체를 이용 하지않고 클래스 이름을 이용하여 직접 호출해야 하는 상황에 사용
정적 메소드는 일반 메소드와는 달리 첫 인수로 self를 받지 않으며 필요한 만큼의 인수를 선언해서 사용.
staticmethod() 를 사용해 정적 메소드 등록
예제를 작성해보자.
클래스로부터 생상되는 인스턴스의 개수를 관리하는 class 를 만들어보자
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class InstanceManager : cnt=0 def __init__(self): InstanceManager.cnt += 1 def s_print_count(): print('instance count : '+str(InstanceManager.cnt)) sprintcount=staticmethod(s_print_count) a=InstanceManager() InstanceManager.s_print_count() a.s_print_count() |
소스를 간단히 설명하면…
instance 객체 생성시, instance 개수를 저장하는 클래스 멤버 변수 cnt가 증가 되도록 설정.
s_print_count() 메소드에서는 instance 개수를 출력.
s_print_count() 메소드는 정적메소드로 등록 하였다.
결과는 아래와 같다.
1 2 3 4 5 6 |
C:\Python33>python InstanceManager.py instance count : 1 Traceback (most recent call last): File "InstanceManager.py", line 14, in <module> a.s_print_count() TypeError: s_print_count() takes 0 positional arguments but 1 was given |
결과와 같이 클래스를 통하여 호출하는 경우는 정상적으로 수행(정적메소드)되나, 인스턴스 객체를 이용하여 호출하는 경우에는 TypeError가 발생하는 것을 확인할 수 있다.
위와 같은 Error가 발생하지 않도록 하기 위해서 클래스 메소드를 이용하면 다음과 같이 다시 작성할수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class InstanceManager : cnt=0 def __init__(self): InstanceManager.cnt += 1 def s_print_count() : print('[staticmethod] instance count : '+str(InstanceManager.cnt)) sprintcount=staticmethod(s_print_count) def c_print_count(cls) : print("[classmethod] instance count : "+str(cls.cnt)) cprintcount=classmethod(c_print_count) a=InstanceManager() InstanceManager.sprintcount() #InstanceManager.s_print_count() a.cprintcount() #a.c_print_count() |
즉 클래스 메소드는 인스턴스에서 정적 메소드처럼 사용할 수 있도록 만들어주며, 암묵적으로 인스턴스의 class 가 매개변수로 넘어간다.
참고 : http://blog.naver.com/dudwo567890?Redirect=Log&logNo=130164152571