파이썬을 코딩을 하다가 @classmethod 데코레이터가 붙어 있는 메서드를 볼 수 있었다. 정확히 어떤 역할을 하는지 몰라서 문서에서 찾아보았다.

@classmethod

Screen Shot 2021-03-03 at 8 48 29 AM

  • 메서드를 클래스 메서드로 변환합니다.
  • 클래스 메서드는 인스턴스 메서드가 인스턴스를 받는 것 처럼 클래스를 암시적인 첫 번째 인수로 수신한다.1

클래스 메서드는 다음과 같이 사용한다.

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ...
  • 클래스 메서드는 다음과 같이 호출 될 수 있다.
    • C.f(), C().f()
  • 앞의 경우에는 클래스에서 호출 된 것이고, 뒤의 경우에는 인스턴스에서 호출 된 것이다.
  • 클래스 메서드가 상속 받은 클래스에서 호출되면 상속 받은 클래스가 첫 번째 인수로 전달된다.
  • 클래스 메서드는 C++, Java의 스태틱 메서드와는 다르다, 만약 앞의 경우로 스태틱 메서드를 사용하고 싶다면, @staticmethod 를 사용하라.

여기까지만 봐서는 정적 메서드랑 무슨 차이인지 알기 힘들었다. 따라서 정적 메서드 관련된 문서를 확인해봤다.

@staticmethod

Screen Shot 2021-03-03 at 9 09 51 AM

  • 메서드를 정적 메서드로 변환시켜 줍니다.
  • 정적 메서드는 암시적으로 첫 번째 인수를 받지 않습니다.2

사용하는 방법은 다음과 같다.

class C:
    @staticmethod
    def f(arg1, arg2, ...): ...
  • 정적 메서드는 다음과 같이 호출 될 수 있습니다.
    • C.f(), C().f()
  • 데코레이터와 마찬가지로, 정적 메서드를 regular 함수 처럼 호출 할 수 있다.
  • 클래스 바디에 함수에 대한 참조가 필요하고 인스턴스 메서드로 자동 변환하지 않으려는 경우에 사용한다.
class C:
    builtin_open = staticmethod(open)

차이점

얼핏봐서는 차이점을 크게 못느껴서 인터넷을 찾아본 결과 좋은 글을 볼 수 있었다. 3

@classmethod@staticmethod는 상속에서 차이가 난다.

class Person:
    default= "아빠"

     def __init__(self):
        self.data = self.default

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

    @staticmethod
    def static_person():
        return Person()

class WhatPerson(Person):
    default = "엄마"
person1 = WhatPerson.class_person()    # return 엄마
person2 = WhatPerson.static_person()   # return 아빠

위와 같이 @staticmethod인 경우에는 부모 클래스의 속성 값을 가져오지만, @classmethod의 경우 cls 인자를 활용하여 클래스의 클래스 속성을 가져온다.

참고 문헌

>> Home