[Python]staticmethod와 classmethod 에 관하여

Jay·2024년 1월 8일
0
post-thumbnail

개요

파이썬으로 웹 애플리케이션을 개발하며 무심코 사용했던 파이썬 구문들이 존재한다. 회사에서 진행하던 프로젝트도 끝났고, 평소에 모호한 개념으로 이해한 상태로 사용했거나 발생했던 이슈들을 정리해보며 추후에 올바른 해결방법이나 의사 결정을 하기위해 글로 정리하기로 했다. 첫번째 주제로는 데이터 수집 서버에서 처리된 데이터를 기사 작성 API로 전달하기 위해 전처리를 수행했던 모듈을 구현하며 사용했던 python의 classmethodstaticmethod이다.



classmethod vs staticmethod

클래스 메소드와 스태틱 메소드 모두 정의된 클래스에 종속된 메소드로, 클래스의 객체를 생성하지 않고 함수를 호출할 수 있다는 특징을 지니고 있습니다. 따라서 두 메소드 모두 ClassName.methodname()과 같은 형태로 메소드를 호출할 수 있습니다.
이와 같이 호출형태도 같은 두 메소드는 어떠한 차이점을 가지고 있으며, 이러한 차이점으로 사용되는 방식과 상황에 차이가 발생하게 됩니다.

class status에 접근할 수 있는가?

두 메소드의 사용 방식을 결정하는 가장 큰 차이점 중 하나로는 class status 에 접근할 수 있는가의 여부입니다. class status는 클래스 내부에 정의된 메소드나 변수의 집합으로, 클래스가 지닌 속성들을 의미합니다.
클래스 메소드를 정의할때 첫번째인자로 메소드가 정의되는 클래스를 의미하는 cls 인자를 첫번째 인자로 정의합니다. 따라서 클래스 메소드에서는 해당 cls인자를 통해 클래스 변수나 다른 클래스 메소드에 접근하여 사용하거나 변경할 수 있습니다.

class C:
    @classmethod
    def f(cls, arg1, arg2):
    	cls.클래스변수 = "abc"
        cls.클래스메소드명() 
        ...

하지만 스태틱 메소드의 경우, @staticmethod 데코레이터를 사용할 뿐, 메소드 호출시 첫번째 인자로 특정 인자가 주어지지 않습니다. 따라서 스태틱 메소드의 경우 clsss status에 접근하거나 수정할 수 없습니다. (사실 클래스.속성으로 접근하자면 접근할 수 있습니다..)

class C:
    @staticmethod
    def f(arg1, arg2, argN):
    	# 물론 C.클래스변수명과 같은식으로 어떻게든 접근하려면 할 수 있습니다..

사용

class status 접근 가능 여부로 두 메소드는 다르게 사용됩니다. 일반적으로 스태틱 메소드는 클래스 변수, 클래스 메소드를 사용하지 않고 인자를 사용한 연산 결과를 반환하는 순수함수의 특징을 지녀 유틸리티 함수를 정의하는데 사용됩니다. 반면 해당 클래스를 인자로 받아 사용할 수 있는 클래스 메소드는 해당 클래스 객체를 반환하는 팩토리 함수를 정의하는데 사용하는데 일반적으로 사용됩니다.





reference

0개의 댓글