반응형

Intro


안녕하세요, 오늘은 우리가 python에서 자주 쓰이는 decorator인 @classmethod@staticmethod 대해서 정리해보려고 합니다.

지난 글(LINK)에서 decorator @뒤에는 decorator를 붙인 함수실행된 뒤 실행할 함수의 이름이 온다고 했습니다.

네, classmethodstaticmethod역시 함수 이름입니다. 이들은 각각 앞서 실행된 함수를 class methodstatic 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 methodstatic 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)

반응형

+ Recent posts