All Articles

Python classmethod, staticmethod, instance method

instance method

class UserInfo:
    # instance method
    def leave(self):
        self.user.delete()
        self.user = None
        self.real_name = None
        self.save()

instance method는 위와 같이 인스턴스를 활용하는 로직(조회, 수정, 삭제)이 필요할 때, 쓰이는 함수다. 함수를 호출한 인스턴스를 암시하는 self를 첫 번째 인자로 받습니다.

classmethod

메서드를 클래스 메서드로 변환합니다. 인스턴스 메서드가 인스턴스를 받는 것처럼, 클래스 메서드는 클래스를 묵시적인 첫 번째 인자로 받습니다. 클래스 메서드를 선언하려면 이 관용구를 사용합니다.

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ...

@classmethod 형식은 함수 데코레이터 입니다. 클래스 (C.f() 처럼) 또는 인스턴스 (C().f() 처럼) 를 통해 호출할 수 있습니다. 인스턴스는 클래스만 참조하고 무시됩니다. 파생 클래스에 대해 클래스 메서드가 호출되면, 파생 클래스 객체가 묵시적인 첫 번째 인자로 전달됩니다.(If a class method is called for a derived class, the derived class object is passed as the implied first argument.)

classmethodstaticmethod의 차이가 이해되지 않아, 다른 블로그에서 본 예제는 아래와 같다.

class Language:
    default_language = "English"

    def __init__(self):
        self.show = '나의 언어는 ' + self.default_language

    @classmethod
    def class_my_language(cls):
        return cls()

    @staticmethod
    def static_my_language():
        return Language()

    def print_language(self):
        print(self.show)


class KoreanLanguage(Language):
    default_language = "한국어"

비교 결과는 아래와 같다. classmethod에서는 cls인자를 활용하여 cls의 클래스 속성을 가져올 수 있다.

즉, 파생 클래스에서 classmethod를 호출하면, 파생 클래스 객체가 암시된 첫 번째 인자로 전달되기에 cls 인자를 활용할 수 있다.

>>> staticmethod = KoreanLanguage.static_my_language()
>>> classmethod = KoreanLanguage.class_my_language()
>>> staticmethod.print_language()
나의 언어는 English
>>> classmethod.print_language()
나의 언어는 한국어

클래스 메서드는 C++ 또는 자바의 정적 메서드와 다릅니다. 그것들을 원하면, 이 섹션의 staticmethod() 를 보세요. 클래스 메서드에 대한 더 자세한 정보를 원하면, 표준형 계층 에 있는 표준 형 계층에 대한 도큐멘테이션을 참고하세요.

staticmethod

메서드를 정적 메서드로 변환합니다. 정적 메서드는 묵시적인 첫 번째 인자를 받지 않습니다. 정적 메서드를 선언하려면, 이 관용구를 사용하세요.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...

@staticmethod 형식은 함수 데코레이터 입니다. 클래스 (C.f() 처럼) 또는 인스턴스 (C().f() 처럼)에 대해 호출할 수 있습니다. 인스턴스는 해당 클래스만 참조하고 무시합니다. 파이썬의 정적 메서드는 자바 또는 C++ 에서 발견되는 정적 메서드와 비슷합니다. 대체 클래스 생성자를 만드는 데 유용한 변형을 보려면 classmethod() 도 보세요. 모든 데코레이터와 마찬가지로, staticmethod 를 정규 함수로 호출하여 그 결과로 어떤 일을 할 수도 있습니다.

이것은 클래스 바디에서 함수에 대한 참조가 필요하고, 인스턴스 메서드로 자동 변환되는 것을 피하고자 할 때 필요합니다. 이 경우 다음 관용구를 사용하세요. (This is needed in some cases where you need a reference to a function from a class body and you want to avoid the automatic transformation to instance method.)

class C:
    builtin_open = staticmethod(open)