정적 메소드, 클래스 메소드, 장식자
정적 메쏘드
정적 메쏘드(static method)란, 인스턴스 객체를 생성하지 않고도, 혹은 인스턴스 객체를 이용 하지 않고도 클래스 이름을 이용하여 직접 호출할 수 있는 메쏘드이다.
C++, Java의 정적 메쏘드와 동일한 개념이다.
정적 메소드는 일반 메소드와는 달리 첫 인수로 self를 받지 않는다. 필요한 만큼의 인수를 선언하면 된다.
staticmethod로 등록하면 정적 메소드가 된다.
클래스 메소드
일반 메소드가 첫 인수(self)로 인스턴스 객체를 받는 것에 비해서, 클래스 메소드는 첫 인수로 "클래스 객체'를 받는다.
메소드를 클래스 메소드로 변환하기 위해서 classmethod() 를 호출해야 한다.
클래스 메소드 호출시 첫 번째 인수로 자동으로 해당 클래스 객체가 전달된다.
C가 첫 번째 인수로 잠재적으로 전달된다.
- 상속받은 클래스인 경우, 첫 번째 인수는 클래스 메쏘드를 호출한 클래스가 된다.
장식자
앞서 설명한 정적 메소드와 클래스 메소드는 메소드 선언 시에 그 유형이 분명히 드러나지 않는 단점이 있다.
@staticmethod나 @classmethod 를 장식자(Decorator)라 하는데, 함수나 메소드 정의 앞 줄에 와야 한다.
장식자는 순차적으로 나타탈 수도 있다.
@A @B @C
def f():
...
혹은 여러 줄에 걸쳐 쓸 수도 있다.
@A
@B
@C
def f():
...
위의 코드는 다음 코드와 동일하다.
def f():
...
f = A(B(C(f)))
장식자가 인수를 가질 수도 있다.
@A @B @C(args)
def f():
...
이것은 다음 코드와 동일하다.
def f():
...
f = A(B(C(args)(f)))
즉, C(args)는 새로운 장식자를 리턴하며, 그 장식자의 인수로 f가 전달된다.
인수의 형 검사를 하는 decorator의 실제적인 예는 다음과 같다.
결과