이번 포스팅에서는 파이썬 클래스 문법에서 자주 마주칠 수 있는 staticmethod(정적 메소드)와 classmethod(클래스 메소드)의 차이점에 대해 예시 코드로 알아보려고 한다. Python1. staticmethod우선 staticmethod는 다음과 같은 특징을 지닌다.
먼저 부모 클래스에서 정의된 staticmethod는 자식 클래스에서 call 할 수 있는 경우이다. 하단의 코드를 살펴보자.
Child 라는 자식 클래스 객체를 선언하고 부모 클래스인 Parent의 staticmethod를 호출하면 제대로 호출되는 것을 볼 수 있다. 다음은 클래스 변수에는 접근이 가능한 특징이다.
역시 이도 정상대로 동작하는 것을 볼 수 있다. 하지만 인스턴스 메소드에는 접근이 불가능하다.
2. classmethod다음은 클래스 메소드의 특징들이다
staticmethod와 특징이 비슷하다. 먼저 첫 번째 특징인 부모 클래스에서 정의된 클래스 변수와 클래스 메소드는 자식 클래스에서도 선언이 가능한 것이 특징이다.
두번째 특징인 클래스 변수에 접근이 가능한 점은 클래스 메소드의 본질적인 특징이므로 따로 설명은 안하겠다. 마지막 인스턴스 메소드 변수에 대한 접근이 불가능한 특징이다.
3. staticmethod VS classmethod두 개의 차이점은 클래스 상속할 때 나뉜다. 우선 staticmethod 는 부모클래스에서 호출하던 자식클래스에서 호출하던 클래스 변수를 모두 바꿀 수 있다. 다음의 코드를 보자.
결과화면은 다음과 같다. 클래스 변수인 name이 모두 손흥민, 박지성으로 바뀐 것을 볼 수 있다. 그러나 classmethod로 선언할 때는 어떻게 결과화면이 바뀌는지 보자. classmethod 일때 결과화면부모 클래스 객체로 선언할 때는 부모, 자식 클래스 변수 모두 손흥민으로 바뀌었지만 자식 클래스 객체로 선언할 때는 자식 클래스의 클래스 변수만 박지성으로 바뀌고 부모 클래스의 변수는 바뀌지 않은 것을 볼 수 있다. 결과적으로, staticmethod는 부모, 자식 클래스 어디에서 선언하든 클래스 변수를 모두 바꾸지만 classmethod에서는 부모 클래스 객체에서 선언해야만 자식 클래스의 클래스 변수까지 모두 바꿀 수 있다. 만약 classmethod를 사용하는데 자식 클래스 객체에서 선언하게 된다면 부모 클래스의 클래스 변수는 그대로이고 자식 클래스의 클래스 변수만 바뀌는 것이다. |