파이썬을 코딩을 하다가 @classmethod
데코레이터가 붙어 있는 메서드를 볼 수 있었다. 정확히 어떤 역할을 하는지 몰라서 문서에서 찾아보았다.
@classmethod
- 메서드를 클래스 메서드로 변환합니다.
- 클래스 메서드는 인스턴스 메서드가 인스턴스를 받는 것 처럼 클래스를 암시적인 첫 번째 인수로 수신한다.1
클래스 메서드는 다음과 같이 사용한다.
class C:
@classmethod
def f(cls, arg1, arg2, ...): ...
- 클래스 메서드는 다음과 같이 호출 될 수 있다.
C.f()
,C().f()
- 앞의 경우에는 클래스에서 호출 된 것이고, 뒤의 경우에는 인스턴스에서 호출 된 것이다.
- 클래스 메서드가 상속 받은 클래스에서 호출되면 상속 받은 클래스가 첫 번째 인수로 전달된다.
- 클래스 메서드는
C++
,Java
의 스태틱 메서드와는 다르다, 만약 앞의 경우로 스태틱 메서드를 사용하고 싶다면,@staticmethod
를 사용하라.
여기까지만 봐서는 정적 메서드랑 무슨 차이인지 알기 힘들었다. 따라서 정적 메서드 관련된 문서를 확인해봤다.
@staticmethod
- 메서드를 정적 메서드로 변환시켜 줍니다.
- 정적 메서드는 암시적으로 첫 번째 인수를 받지 않습니다.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 인자를 활용하여 클래스의 클래스 속성을 가져온다.