Intro
안녕하세요, 오늘은 우리가 python에서 자주 쓰이는 decorator인 @classmethod
와 @staticmethod
대해서 정리해보려고 합니다.
지난 글(LINK)에서 decorator @
뒤에는 decorator를 붙인 함수가 실행된 뒤 실행할 함수의 이름이 온다고 했습니다.
네, classmethod
와 staticmethod
역시 함수 이름입니다. 이들은 각각 앞서 실행된 함수를 class method와 static method로 변환해주는 함수입니다. class method와 static method는 class나 instance를 통해서 접근할 수 있습니다.
참고) 두 decorator 모두 class내에서 선언되어 사용됩니다. 일발적으로 우리가 class안에 선언해서 첫 번째 인자로 self
를 받는 method를 instance method라고 합니다.
instance method, class method, static method
intance method는 우리가 일반적으로 class 내부에 정의하는 self
라는 인수를 첫 번째로 받는 method입니다. 이때 우리는 class의 instance를 생성해야만 instance method를 실행할 수 있습니다.
반면에 class method와 static method는 객체가 없어도 실행될 수 있습니다. 그렇다면 둘의 차이점은 무엇일까요?
그것은 바로 class method는 첫 번째 인자로 항상 class를 받고(일반적으로 cls
라고 이름 붙힙니다.), static method는 아무런 인자나 자유롭게 받을 수 있다는 겁니다.
이는 class method는 class내에서 _공유되는 variable, class method, 그리고 static method_에 접근할 수 있고, static method는 다른 variable나 method에는 접근할 수 없고, 인자로 받은 값만으로 할 수 있는 기능을 수행합니다.
따라서 class의 instance들끼리 공유하는 variable이나 class/ static method를 다루는 method를 정의할 때는 @classmethod
를 붙여줍니다.
static method는 사실 class내에 꼭 있을 필요는 없지만, class와 연관성이 있는 method를 안에 정의하고 class, instance를 통해 사용함으로써 코드 가독성을 높일 수 있고, 이 경우 @staticmethod
를 붙여줍니다.
Code test
간단한 예시를 통해서 @classmethod, @staticmethod
decorator의 쓰임을 확인해보겠습니다.
오직 기능 확인만을 목적으로 만든 허접한 예시입니다.
class Employee():
company = "저승네트워크"
def __init__(self, name, enter_year):
self.name = name
self.enter_year = enter_year
def self_introduction(self):
print(f'안녕하세요, 저는 {self.company}에 {self.enter_year}년에 입사한 {self.name} 이라고 합니다.')
@classmethod
def company_introduction(cls):
print(f'저는 {cls.company}에 다닙니다.')
@classmethod
def recommendation_with_company(cls, friend):
cls.recommendation(friend)
print(f'{cls.company}에 꼭 필요한 사람입니다.')
@staticmethod
def recommendation(friend):
print(f'제 친구 {friend}를 우리 회사에 추천합니다.')
class variable company
, instance variable name, enter_year
, instance method __init__(), self_introduction()
, classmethod company_introduction(), recommendation_with_company()
, static_method recommendation
을 선언했습니다.
이들을, class 또는 instance를 통해서 사용해보겠습니다.
Employee
를 통해 접근할 수 있는 것은 class variable, class method, static method입니다. 그 외에는 instance가 있어야합니다.
instance를 생성한 뒤에는 어느 것이든 접근할 수 있습니다. 애초에 instance들 끼리 서로 공유하라고 class variable/method와 static method가 있는 것이니까요.
마무리
오늘은 python의 @classmethod, @staticmethod
decorator에 대해서 살펴봤습니다. 좋은 하루 보내세요!
References
파이썬 - OOP Part 4. 클래스 메소드와 스태틱 메소드 (Class Method and Static Method) (LINK)
'[Python]' 카테고리의 다른 글
[Python] timeit 모듈과 pandas함수들의 속도 비교 테스트 (0) | 2021.07.18 |
---|---|
[Python] Mixin 이란? (0) | 2021.07.10 |
[Python] Decorator(4) - dataclass, functools (0) | 2021.07.04 |
[Python] Decorator (2) - @property (0) | 2021.06.20 |
[Python] Decorator(1) - decorator란? (0) | 2021.06.15 |