본문 바로가기
Python/Python 기초

Python staticmethod 왜 사용해야할까?

by 마이자몽 🌻♚ 2021. 10. 4.

Python staticmethod

Python staticmethod는 @staticmethod 데코레이터를 사용한 정적 메소드 입니다.

  • 인스턴스 메소드와는 다르게 self 인자를 받지 않는다.
  • 클래스 이름으로 직접 메소드를 호출할 수 있다.
  • 인스턴스 속성에 접근하거나 인스턴스 메소드를 호출할 수 없다.

이런 특징들이 있어서 유틸리티성 메소드를 생성할 때 사용된다고 한다. 그런데 유틸리티성 메소드들은 주로 따로 utils라는 모듈로 빼서 작성하는 경우가 많은데... 클래스 내에서는 왜  staticmethod가 필요할까요? 아래 실습을 통해서 좀 더 자세히 확인해보겠습니다.

 

 

Playlist 실습

import random
import json
import hashlib


class Playlist:
    class NoMusicInPlayListException(Exception):
        """Raised when music is not in the playlist."""
        pass

    def __init__(self):
        self._playlist = []
        self.current_play = None

    def show(self):
        print(self._playlist)

    def add(self, music):
        self._playlist.append(music)

    def remove(self, title):
        for music in self._playlist:
            if music['title'] == title:
                self._playlist.remove(music)
                break

    def play(self, title):
        for music in self._playlist:
            if title == music['title']:
                self.current_play = music
                print(f'"{self.current_play["title"]}" is playing...')
                break
        else:
            raise self.NoMusicInPlayListException(f'"{music}" is not in the playlist.')

    def random_play(self):
        self.current_play = random.choice(self._playlist)
        print(f'"{self.current_play["title"]}" is playing...')

    @staticmethod
    def playtime_diff(music1, music2):
        return abs(music1['play_time'] - music2['play_time'])

    @staticmethod
    def hash(music):
        music_str = json.dumps(music, sort_keys=True).encode()
        return hashlib.sha256(music_str).hexdigest()


if __name__ == "__main__":
    p = Playlist()

    p.add({"title": "Circle", "artist": "Post Malone", "play_time": 3.47})
    p.add({"title": "Better Now", "artist": "Post Malone", "play_time": 3.53})

    p.show()
    p.random_play()

    print(p.hash({"title": "Better Now", "artist": "Post Malone"}))
    print(
        p.playtime_diff(
            {"title": "Circle", "artist": "Post Malone", "play_time": 3.47},
            {"title": "Better Now", "artist": "Post Malone", "play_time": 3.53}
        )
    )

 위 코드는 간단하게 Playlist를 만들어서 노래를 추가, 삭제하고 재생하는 형식의 클래스를 생성했습니다. staticmethod로 playtime_diffhash 함수를 생성했습니다.

 

 두 함수들의 공통점은 클래스에 의존하지 않고 유틸리티성 함수라는 것입니다. 음... 어쨋든 music이라는 딕셔너리 구조를 들고 가야하기 때문에 완젼히 의존하지 않는다고는 할 수 없습니다. 하지만... 클래스 내의 다른 속성이나 함수에 의존하지 않기 때문에 유틸리티성 함수로 static하게 정의하는 것이 맞다고 판단 됩니다.

 

 제가 다른 Python 코드들을 보면서 매번 "왜 이 함수를 staticmethod로 정의했는지..." 의문을 가졌습니다. 그런데 대부분 같은 패턴하나가 있었습니다. self를 이용해서 클래스의 속성이나 함수를 사용하지 않는 경우... 즉, 의존성이 없는 경우 모두 staticmethod로 정의했스빈다.

 

staticmethod 장점

static method는 단순히 유틸리티성 함수에 사용한다라고 이해하기 보다는... 아래 4가지 장점이 있기 때문에 사용하는 것으로 이해하는 것이 좋습니다.

  • self 인자를 사용할 필요가 없다.
  • 인스턴스화할 때 static method에 대해서는 bound-method를 생성해줄 필요가 없어 메모리 사용량을 줄일 수 있다.
  • 인스턴스 오브젝트 자체에 의존하지 않는다는 것을 의미하여 코드의 가시성이 좋아진다.

 

태그

댓글0