Python 정적 메소드와 클래스 메소드

 

정적 메소드 : 인스턴스 객체를 이용 하지않고 클래스 이름을 이용하여 직접 호출해야 하는 상황에 사용

정적 메소드는 일반 메소드와는 달리 첫 인수로 self를 받지 않으며 필요한 만큼의 인수를 선언해서 사용.

staticmethod() 를 사용해 정적 메소드 등록

예제를 작성해보자.

클래스로부터 생상되는 인스턴스의 개수를 관리하는 class 를 만들어보자

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() 메소드는 정적메소드로 등록 하였다.

결과는 아래와 같다.

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가 발생하지 않도록 하기 위해서 클래스 메소드를 이용하면 다음과 같이 다시 작성할수 있다.

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

 

This entry was posted in Python/Ruby/Perl and tagged . Bookmark the permalink.

댓글 남기기