본문 바로가기

컴퓨터/Python

정적메서드, 클래스메서드

정적메서드 - 인스턴스 객체를 통하지 않고 클래스를 직접 호출할 수 있는 메서드

클래스메서드 - 암묵적으로 첫 인자로 클래스 객체가 전달

두 경우 모두 클래스 내에서 등록해야 함

<호출할 메서드 이름> = staticmethod(클래스 내에 정의한 메서드 이름)

<호출할 메서드 이름> = classmethod(클래스 내에 정의한 메서드 이름)



>>> class CounterManager:

insCount = 0

def __init__(self):

CounterManager.insCount += 1

def printInstaceCount():

print("Instance Count: ", CounterManager.insCount)

>>> a, b, c = CounterManager(), CounterManager(), CounterManager()

>>> CounterManager.printInstaceCount()

Instance Count:  3

>>> b.printInstaceCount()        <<<암묵적으로 인스턴스 객체를 받기 때문에 Error가 발생

Traceback (most recent call last):

  File "<pyshell#12>", line 1, in <module>

    b.printInstaceCount()

TypeError: printInstaceCount() takes no arguments (1 given)


인스턴스 영역의 값을 참조하지 않기 때문에 메서드를 정의할 때 첫 인자로 암묵적으로 받는 인스턴스 객체는 사용하지 않았다. 그 결과 클래스를 통해 호출하는 경우 정상적으로 수핼되나, 인스턴스 객체를 이용해 호출하는 경우에는 TypeError가 발생



정적메서드, 클래스 메서드를 적용한 CounterManager 클래스

>>> class CounterManager:

insCount = 0

def __init__(self):

CounterManager.insCount += 1

def staticPrintCount():

print("Instance Count: ", CounterManager.insCount)

SPrintCount = staticmethod(staticPrintCount)

def classPrintCount(cls):

print("Instance Count: ", cls.insCount)

CPrintCount = classmethod(classPrintCount)

>>> a, b, c = CounterManager(), CounterManager(), CounterManager()

>>> CounterManager.SPrintCount()

Instance Count:  3

>>> b.SPrintCount()

Instance Count:  3

>>> CounterManager.CPrintCount()

Instance Count:  3

>>> b.CPrintCount()

Instance Count:  3


정적메서드로 출력하는 경우 암묵적으로 받는 첫 인자가 필요하지 않음, 정의한 메서드는 정적메서드로 등록해야 함, 호출 할 때는 등록된 이름으로 호출


클래스메서드는 첫 인자는 암묵적으로 클래스 객체가 됨, 클래스 메서드로 등록해야 호출할 때 암묵적으로 클래스 객체를 전달함

인스턴스 객체를 통해서도 호출할 수 있음



이름 변경(Naming Mangling)

클래스 내의 멤버 변수나 함수를 정의할 때 이름이 '__'로 시작하는 경우 

클래스 외부에서 참조할 때 자동적으로 '_[클래스이름]__[멤버이름]'으로 변경해야 함

내부에서는 '__[멤버이름]'으로 사용

>>> class CounterManager:

__insCount = 0

def __init__(self):

CounterManager.__insCount += 1

def staticPrintCount():

print("Instance Count: %d" % CounterManager.__insCount)

SPrintCount = staticmethod(staticPrintCount)


>>> a, b, c = CounterManager(), CounterManager(), CounterManager()

>>> CounterManager.staticPrintCount()

Instance Count: 3

>>> print(CounterManager.__insCount)        << 외부에선 print(CounterManager._CounterManager__insCount)

Traceback (most recent call last):

  File "<pyshell#26>", line 1, in <module>

    print(CounterManager.__insCount)

AttributeError: type object 'CounterManager' has no attribute '__insCount'

>>> dir(CounterManager)

['SPrintCount', '_CounterManager__insCount', (중략)]



'컴퓨터 > Python' 카테고리의 다른 글

상속  (0) 2013.07.18
연산자 중복 정의  (0) 2013.07.17
생성자, 소멸자 메서드  (0) 2013.07.16
클래스 객체와 인스턴스 객체의 관계  (0) 2013.07.15
클래스 객체 와 인스턴스 객체의 이름공간  (0) 2013.07.15