정적메서드 - 인스턴스 객체를 통하지 않고 클래스를 직접 호출할 수 있는 메서드
클래스메서드 - 암묵적으로 첫 인자로 클래스 객체가 전달
두 경우 모두 클래스 내에서 등록해야 함
<호출할 메서드 이름> = 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 |