classmethod와 staticmethod란
classmethod
클래스 메소드는 아래와 같이 @classmethod를 클래스 함수에 붙이는 문법으로 사용할 뿐이다. 첫 번째 인수로 일반적으로 사용하는 self가 아닌, cls를 사용한다.
class MyClass:
CLASS_PARAM = 100
def __init__(self, instance_param):
self.instance_param = instance_param
@classmethod
def method(cls):
print(cls.CLASS_PARAM)
# print(cls.instance_param)는 불가능하다.
함수 안에서는 인스턴스 변수로의 액세스는 안되지만, 클래스 변수에 액세스하는 것은 가능하다. 또한, 다른 클래스 메소드나 스태틱 메소드에도 액세스 가능하다.
필요로하는 인스턴수 변수가 없을 경우 사용한다. 그러므로 클래스 변수에 액세스해야할 때나, 상속 클래스 동작을 바꿔야할 경우에는 classmethod를 사용하자.
staticmethod
인스턴스 메소드나 클래스 메소드와 달리, 지정된 첫 번째 인수가 없고, 필요한 인수를 첫 번째부터 쓴다.
class MyClass:
CLASS_PARAM = 100
def __init__(self, instance_param):
self.instance_param = instance_param
@classmethod
def method(cls):
print(cls.CLASS_PARAM)
# print(cls.instance_param) 는 불가능하다.
@staticmethod
def method_2(param):
print("Static!!", param)
# cls.method() 불가능하다.
# print(cls.CLASS_PARAM) 불가능하다.
# print(self.instance_param) 불가능하다.
함수 내에서는 인스턴스 변수나 클래스 변수, 다른 함수에도 액세스 할 수 없다. 클래스 내 다른 구현에 의존하지 않는 함수이다.
필요로 하는 독립된 함수로써 구현하는 경우에 사용할 수 있다. 그러므로 상속 클래스에도 동작을 바꾸지 않을 경우에 사용하자.
구분 사용의 장점
구분해서 사용함에 있어서의 장점은 아래의 세 가지이다.
- 가독성, 보수성
- 인스턴스화의 수고가 감소
- 퍼포먼스
가독성, 보수성
첫 번째 인수가 self이거나 cls이거나 해서 오히려 가독성이 떨어진다는 의견이 있을 수 있다. 그러나 다른 사람의 코드를 읽을 때, 인스턴스 변수가 얽혀있는 함수는 읽기 힘든 경향이 있다. 특히 다른 함수에서 조작되고 있는 인스턴스 변수가 더욱이 다른 함수에서 등장하는 다양한 케이스는 더더욱 파악하기 힘들다. 따라서 명시적으로 표현함으로써 가독성을 올리고, 가독성이 높은 코드는 자연스럽게 보수하기 쉬워진다.
인스턴스화의 수고가 감소
인스턴스 메소드를 사용할 때 한 번 인스턴스화하지 않으면 안 되지만, 클래스 메소드나 스태틱 메소드인 경우, 그러한 과정이 필요없어진다.
# 인스턴스 메소드로 구현되어 있는 경우
object = MyClass()
object.method()
# 클래스 메소드로 구현되어 있는 경우
MyClass.method()
퍼포먼스
매번 인스턴스화하지 않는다는 것은 처리도 감소하는 것을 의미하다. 무의미한 인스턴스로 메모리를 사용하지 않게 되므로 부담이 줄어든다.
참고자료
https://it-for-pharma.com/python-classmethod%E3%81%A8staticmethod%E3%82%92%E4%BD%BF%E3%81%86%E6%84%8F%E5%91%B3%E3%82%92%E8%80%83%E3%81%88%E3%82%8B
https://qiita.com/msrks/items/fdc9afd12effc2cba1bc
https://blog.pyq.jp/entry/Python_kaiketsu_190205
'IT > 언어' 카테고리의 다른 글
[python] Numpy배열 ndarray를 결합시키는 방법(concatenate, stack, block 등) (0) | 2021.11.02 |
---|---|
[python] python을 이용해 GPU 사용률 등의 정보 얻기(nvidia-smi커맨드) (0) | 2021.09.24 |
[python] matplotlib의 figure(그림)과 axes(좌표축) (0) | 2021.09.07 |
[python] assert문 간단 사용법 (0) | 2021.09.01 |
[python/pandas] 특정 위치의 값을 획득하거나 바꿀 때 사용하는 loc, iloc, iat, at (2) | 2021.08.16 |